Как преобразовать привязку pollingDuplex в настраиваемую привязку? - PullRequest
1 голос
/ 17 июня 2011

Я использую привязку pollingDuplex для связи между моим веб-приложением Silverlight и моим веб-сервисом WCF.До сих пор он работал нормально, пока я не попытался отправить большие объемы данных из веб-приложения в веб-службу в виде xmlString.Затем я получил сообщение об ошибке:

"Программа форматирования вызвала исключение при попытке десериализации сообщения: Ошибка в теле десериализации сообщения запроса для операции 'SendUserSelection'. Максимальная длина содержимого строкиквота (8192) была превышена при чтении данных XML. Эту квоту можно увеличить, изменив свойство MaxStringContentLength объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML. "

Я обнаружил, что вЧтобы увеличить свойство MaxStringContentLength, мне нужно преобразовать привязку pollingDuplex в настраиваемую привязку (http://blogs.msdn.com/b/silverlightws/archive/2010/04/04/some-known-wcf-issues-in-silverlight-4.aspx). Мой вопрос: как мне это сделать?

Моя привязка pollingDuplex определена в файле web.config файлавеб-служба выглядит следующим образом:

<pollingDuplex>
  <binding name="myPollingDuplex" closeTimeout="00:10:00" openTimeout="00:10:00"
    receiveTimeout="00:10:00" sendTimeout="00:10:00" duplexMode="MultipleMessagesPerPoll" />

Конечная точка:

<endpoint address="" binding="pollingDuplex" bindingConfiguration="myPollingDuplex" contract="WebApplication.Web.MainWS"/>

Код на стороне веб-приложения для создания экземпляра клиента веб-службы:

this.client = new MainWSRef.MainWSClient(new PollingDuplexHttpBinding { DuplexMode = PollingDuplexMode.MultipleMessagesPerPoll },
            new EndpointAddress("http://localhost:1981/MainWS.svc"));

Я попробовал следующее:

<customBinding>
    <binding name="myPollingDuplex" closeTimeout="00:10:00" openTimeout="00:10:00"
    receiveTimeout="00:10:00" sendTimeout="00:10:00">
      <pollingDuplex duplexMode="MultipleMessagesPerPoll">
      </pollingDuplex>
      <textMessageEncoding>
      <readerQuotas maxDepth="32" maxStringContentLength="5242880"
      maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </textMessageEncoding>
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </customBinding>

Конечная точка:

<endpoint address="" binding="customBinding" bindingConfiguration="myPollingDuplex" contract="WebApplication.Web.MainWS"/>

Код на стороне веб-приложения:

CustomBinding binding = new CustomBinding(new PollingDuplexBindingElement(), new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement());
        this.client = new MainWSRef.MainWSClient(binding, new EndpointAddress("http://localhost:1981/MainWS.svc"));

Когда я пытаюсь запустить код, я получаю следующее сообщение об ошибке:

"Theудаленный сервер возвратил ошибку: NotFound. "

Я что-то не так делаю?Буду признателен за любые предложения.

1 Ответ

0 голосов
/ 20 июня 2011

Я получаю ту же ошибку при указании ReceiveTimeout="02:00:00", без этого она работает. Я пытаюсь выяснить, как установить ReveiveTimeout без ошибки.

Обновление: Я думаю, что это работает, вот мой сервер web.config:

<customBinding>
    <binding name="SLDuplexService" receiveTimeout="02:00:00">
      <pollingDuplex duplexMode="MultipleMessagesPerPoll"
           maxPendingSessions="2147483647" maxPendingMessagesPerSession="2147483647" maxOutputDelay="00:00:05"
                     inactivityTimeout="02:00:00" />
      <binaryMessageEncoding/>
      <httpTransport transferMode="StreamedResponse"/>
    </binding>
  </customBinding>

Обратите внимание, что receiveTimeout является свойством привязки, тогда как inactivityTimeout является свойством pollingDuplex. Оба таймаута должны быть установлены, если вы не хотите, чтобы неисправный канал через 10 минут.

Вы также должны указать тайм-ауты на клиенте, вот мой код:

PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding(PollingDuplexHttpSecurityMode.None, PollingDuplexMode.MultipleMessagesPerPoll);
            binding.InactivityTimeout = new TimeSpan(2,0,0);
            binding.ReceiveTimeout = new TimeSpan(2, 0, 0);

          _client = new SLDuplexServiceClient(binding, new EndpointAddress("http://localhost/LpSystem.ServiceInterface.Web/SLDuplexService/SLDuplexService.svc"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...