#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, поэтому внутренней проблемы нет).