1

SilverlightWebアプリケーションとWCFWebサービス間の通信にpollingDuplexバインディングを使用しています。これまでは、xmlStringの形式でWebアプリケーションからWebサービスに大量のデータを送信しようとするまでは正常に機能していました。次に、エラーメッセージが表示されました。

「フォーマッタがメッセージの逆シリアル化中に例外をスローしました:操作'SendUserSelection'の要求メッセージの本文の逆シリアル化中にエラーが発生しました。XMLデータの読み取り中に最大文字列コンテンツ長のクォータ(8192)を超えました。このクォータは変更することで増加する可能性がありますXMLリーダーの作成時に使用されるXmlDictionaryReaderQuotasオブジェクトのMaxStringContentLengthプロパティ。」

MaxStringContentLengthプロパティを増やすには、pollingDuplexバインディングをカスタムバインディングに変換する必要があることがわかりました(http://blogs.msdn.com/b/silverlightws/archive/2010/04/04/some-known-wcf- issues-in-silverlight-4.aspx)。私の質問はどうすればそれができるのかということです。

Webサービスのweb.configファイルで定義されているpolingDuplexバインディングは、次のようになります。

<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"/>

Webサービスクライアントをインスタンス化するためのWebアプリケーション側のコード:

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"/>

Webアプリケーション側のコード:

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

コードを実行しようとすると、次のエラーメッセージが表示されます。

「リモートサーバーがエラーを返しました:NotFound。」

私は何か間違ったことをしていますか?何か提案をいただければ幸いです。

4

1 に答える 1

0

を指定すると同じエラーが発生しますが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"));
于 2011-06-20T13:55:29.657 に答える