none
netTcpでのタイムアウトエラーについて RRS feed

  • 質問

  • netTcpで通信を行おうとしていますが、1.5Mを超えるデータを送信する辺りで
    下記のようなエラーメッセージが表示されました。
    (1Mデータなら送受信できます。)

    (エラーメッセージ)
                   System.ServiceModel.CommunicationException: ソケット接続が中止さ
    れました。これは、メッセージ処理時のエラー、リモート ホストでの受信タイムアウト
    の超過、または基になるネットワーク リソースの問題が原因で発生する可能性がありま
    す。ローカル ソケットのタイムアウトは '00:59:59.9843750' でした。 ---> System.Ne
    t.Sockets.SocketException: 確立された接続がホスト コンピュータのソウトウェアによ
    って中止されました。
       場所 System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size,
    SocketFlags socketFlags)
       場所 System.ServiceModel.Channels.SocketConnection.Write(Byte[] buffer, Int32
     offset, Int32 size, Boolean immediate, TimeSpan timeout)


    タイムアウトの超過とメッセージが出ているのでとりあえずWCF中のnetTcpの設定値である
    『closeTimeout』、『openTimeout』、『receiveTimeout』、『sendTimeout』をすべて
    『01:00:00』に定義して実行しましたが、同様のエラーが発生します。

    定義例:
      <netTcpBinding>
        <binding name="NetSecurity" closeTimeout="01:00:00"
          openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00"
          maxReceivedMessageSize="131072"
          hostNameComparisonMode="StrongWildcard"
          transferMode="Buffered">
          <readerQuotas maxStringContentLength="131072"/>
          <security mode="None"></security>
        </binding>
      </netTcpBinding>


    1秒も経たずにすぐエラーが発生するので、タイムアウト設定とは無関係な位置で
    問題があるようにも思えますが(※エラー発生がSocket.Sendということもあり)
    解決方法、設定上まずい点があればご教授お願い致します。

    2007年3月19日 5:51

回答

  • 自己解決しました。

    とりあえず『maxReceivedMessageSize』の指定が小さかっただけでした。

    1Mでは問題なく、1.5Mでコメントしてしまっていましたが、定義例では1Mにも満たず失礼しました。

     

    ちなみに、他のBasicHttpBindingですと『maxReceivedMessageSize』が足りない場合のエラーは

    System.ServiceModel.ProtocolException: リモート サーバーから予期
    しない応答が返されました: (400) Bad Request。 ---> System.Net.WebException: リモ
    ート サーバーがエラーを返しました: (400) 要求が不適切です。

    というメッセージが出力されました。
    Binding指定とメッセージの内容が統一されていない(というか今回はタイムアウトは無関係)であるので
    エラーメッセージを読んで私が勘違いした次第です。

     

    (その他、メッセージ例:BasicHttpBindingでのタイムアウト設定を間違えた場合のメッセージ)
    System.TimeoutException: 要求チャネルは、応答を待機してから 00:0
    0:55.9375000 後にタイムアウトしました。Request の呼び出しに渡すタイムアウト値を
    増やすか、Binding の SendTimeout 値を増やしてください。この操作に割り当てられた
    時間は、より長いタイムアウト時間の一部であった可能性があります。

     

    問題なく動作しそうです。ありがとうございました。

    2007年3月26日 10:16