0

netTcpBindingを使用するアプリケーションが突然動作を停止したことに気づきました。サービスをホストしているサーバーのイベントログを調べたところ、次の警告が見つかりました(一連の警告の1つ)。

例外情報:例外タイプ:TimeoutException例外メッセージ:割り当てられたタイムアウト00:01:00内にオープン操作が完了しませんでした。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。

サーバースタックトレース:System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout、CallOnceManagercascade)at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)atSystem。 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime operation)でのServiceModel.Channels.ServiceChannel.Call(String action、Boolean oneway、ProxyOperationRuntime operation、Object [] ins、Object [] outs、TimeSpan timeout)atSystem。 ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)

この問題を修正するには、maxReceivedMessageSizeのサイズを10増やす必要があったため、新しいバインディングは次のようになります。

>  <netTcpBinding>
>     <binding name="largeBufferNetTcpBinding" listenBacklog="100" maxBufferSize="519730000" maxConnections="100"
>              maxReceivedMessageSize="519730000" portSharingEnabled="true">
>       <readerQuotas maxArrayLength="519730000"/>
>       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
>       <security>
>         <message clientCredentialType="Windows"/>
>       </security>
>     </binding>
>     <binding name="defaultNetTcpBinding" portSharingEnabled="true"/>
>     <binding name="defaultNetTcpMexBinding" portSharingEnabled="true">
>       <security mode="None"/>
>     </binding>      </netTcpBinding>

maxReceivedMessageSizeが上記のTimeoutExceptionとどのように関連しているかわかりません。これをさらにトラブルシューティングし、サービスの信頼性を高めるにはどうすればよいですか?

4

1 に答える 1

1

質問の情報に基づいて、クライアントとサービスのやり取りで何が起こっているのかを正確に伝えるのは難しいですが、次のことを試してみてください。

まず、519730000に設定したすべてのものをデフォルト値に戻します。ただし、maxReceivedMessageSizeは2〜3 MBの範囲に設定する必要があります(2097152から開始し、メッセージサイズの例外がなくなるまで増やします)。

それが機能しない場合は、私が提案したのと同じ設定を維持しますが、このテストのサービスとクライアントの両方ではbasicHttpBindingなく、構成をに変更します。netTcpBindingこのバインディングの変更が機能する場合は、WCFクライアントインスタンス(ClientBaseまたはからのチャネルChannelFactory)を適切に破棄していない可能性があります。netTcpBindingセッションに依存し、クライアントインスタンスが正しく破棄されない場合、コードはサービスとクライアントの両方でTCPリソースを効率的に解放していません。ところで: WCF Dispose実装のファンキーさのために、クライアントインスタンスをラップするusingことも正しい方法ではありません。

それでも呼び出しにタイムアウトがある場合は、TCPとクライアントの不適切な構成をほぼ排除しているため、サービス実装のコードパフォーマンスに焦点を当てる必要があります。

于 2012-11-28T18:05:21.853 に答える