Как отправить данные изображения в службу WCF

#c# #wcf-binding

#c# #wcf-привязка

Вопрос:

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

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

App.Config: введите описание изображения здесь

Web.Config: введите описание изображения здесь

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

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

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

 <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:images1FAHP35N18W1589_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);
  

Комментарии:

1. Вы пытались перезапустить сервер после изменения файла конфигурации? Кроме того, вы пробовали отправлять изображение размером менее 65 КБ? Это было бы хорошим местом для начала.

2. Совет: отправьте код, также XML, в виде текста с правильным форматированием ( {} кнопка). Значительно упрощает поиск и т.д.

3. @Paul Sasik Я пробовал отправлять изображение меньшего размера, которое было меньше 65 кб, и это действительно работает. Проблема в том, что я собираюсь отправлять изображения размером около 90-120 Кб каждое.

Ответ №1:

Все в WCF сильно ограничено (задушено), и на то есть причины.

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

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

Комментарии:

1. Да, я ввел такие высокие значения только из-за ошибки, которую я получаю. Я увеличил число до такого высокого значения, чтобы посмотреть, решит ли это проблему, а затем я бы проделал обратный путь, чтобы уменьшить его, узнав, что у меня есть разрешение. Я уже пробовал MTOM, и это тоже не изменило результат.

2. Я бы рассмотрел поток. С ним легко работать, и он обеспечивает потоковое (асинхронное) поведение, которое в любом случае необходимо.

Ответ №2:

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

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

Комментарии:

1. Да, я установил это значение как в конфигурации клиента, так и в web.config.

2. Можете ли вы добавить точное сообщение об ошибке, которое вы получаете? Это поможет нам точно определить конфигурацию, которую необходимо изменить (к вашему сведению: мы успешно переносим очень большие (> 1 ГБ) файлы через WCF, поэтому внутренней проблемы нет).