Как отправить данные изображения в службу WCF? - PullRequest
0 голосов
/ 08 ноября 2011

Я искал и перепробовал все предыдущие опубликованные предлагаемые решения, но мне не повезло.Я, очевидно, делаю что-то не так, что я просто не могу понять, и я надеюсь, что кто-то сможет помочь мне здесь. Моя проблема заключается в следующем:

У меня есть служба WCF и клиент WCF.Когда я вызываю службу и пытаюсь передать массив байтов (загружая изображение в службу), я получаю ошибку исключения Target Invocation, которая очень расплывчата.Итак, я подключил трассировку, и журнал трассировки сообщает мне, что размер квоты сообщений превысил ограничение, но я изменил конфиги на обоих концах (app.config & web.config), чтобы они содержали действительно большой предел.Проблема в том, что он говорит мне, что предел 65536 был превышен, но, как вы можете видеть из моих конфигов ниже, он намного больше этой суммы, так что мой клиент использует некоторые другие значения конфигурации, или я просто не настроилэто правильно, и это игнорирует то, что у меня есть.Кто-нибудь может мне помочь?

App.Config: enter image description here

Web.Config: enter image description here

Любая помощь, которую вы, ребята, могли бы предложить, будет принята с благодарностью.Я застрял в этой проблеме уже два дня.

Спасибо всем.

Вот фактический код конфигурации:

<system.serviceModel>
    <bindings>            
        <wsHttpBinding>
            <binding name="WSHttpBinding_IDataSyncService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Message">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/DataSyncWCF/DataSyncService.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDataSyncService"
            contract="IDataSyncService" name="WSHttpBinding_IDataSyncService">
            <identity>
              <dns value="localhost" />
            </identity>
      </endpoint>
    </client>
</system.serviceModel> 

Web.Config:

<services>
  <service behaviorConfiguration="DataSyncWCF.Service1Behavior"
    name="DataSyncWCF.DataSyncService">
    <endpoint address="" binding="wsHttpBinding" bindingName="WSHttpBinding_IDataSyncService"
      contract="DataSyncWCF.IDataSyncService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<bindings>      
  <wsHttpBinding>
    <binding name="DataSyncWCF.Service1Binding" maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="2147483647" allowCookies="true">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None">            
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="DataSyncWCF.Service1Behavior">          
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

Вот мой код вызова службы WCF:

VehicleImage vi = new VehicleImage();
System.IO.FileStream fs = new System.IO.FileStream(@"C:\images\1FAHP35N18W1589_01.jpg",        System.IO.FileMode.Open, System.IO.FileAccess.Read);
int len = (int)fs.Length;
vi = new VehicleImage();
vi.Image = new Byte[len];            
fs.Read(vi.Image, 0, len);   

// Here's the call to the WCF Service. It never makes it to the Service because of the message size limit error.
ResponseContract rc = client.SyncImage(vi);

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Все в WCF сильно ограничено (ограничено) по причине.

Я вижу много цифр 2G в вашем конфиге, что было бы не очень хорошей идеей. И вы, возможно, пропустили несколько, я не могу определить SerializationLimit (приблизительное имя) так быстро.

Существует два основных способа работы с большими сообщениями в WCF: MTOM и потоковая передача.

1 голос
/ 08 ноября 2011

В вашем web.config wsHttpBinding установите maxReceivedMessageSize:

<binding name="www" maxReceivedMessageSize="2147483647">
...