私はWindowsサービスとしてセルフホストされているWCFサービスにアクセスするwinformアプリケーションを開発中です。私はサービス参照の代わりにChannelFactoryを使用しています。私はWCFサービスの接続と呼び出しに成功しています。問題は、アプリケーションを20分間アイドル状態にしてからもう一度電話をかけようとするときです。WCF ChannelFactoryと接続タイムアウトのベストプラクティス
"ソケット接続が中止されました。これは、メッセージの処理中にエラーが発生したか、リモートホストが受信タイムアウトを超過したか、またはネットワークリソースの問題が原因で発生している可能性があります。 00:00:59.9489970 '
私は接続の管理に関するベストプラクティスを探しています。私は現在、チャンネルとChannelFactoryの状態をチェックするPrepareWCFConnection(下記参照)という関数を作成しました。私はWCFサービスを呼び出す前にこのメソッドを呼び出します。これを処理するより良い方法はありますか?あなたは、すべて9 minutes.Iがデフォルトだと思うサービスをpingすることで、生きているチャネルを維持する必要がある既存のチャネルを再利用したい場合は、それが保持されている場合、チャネルが切断されますので、
public bool PrepareWCFConnection()
{
if ((channelFactory == null) ||
(channelFactory.State == CommunicationState.Faulted) ||
(channelFactory.State != CommunicationState.Opened))
{
channelFactory = new ChannelFactory<IService1>(new NetTcpBinding(), endpointAddress);
}
if ((proxy == null) ||
(((IClientChannel)proxy).State == CommunicationState.Faulted) ||
(((IClientChannel)proxy).State != CommunicationState.Opened))
{
proxy = channelFactory.CreateChannel(endpointAddress);
((IClientChannel)proxy).Open();
}
return true;
}
より多くのテストは、それが動作しないことが判明しました。 ChannelFactoryとチャンネルの両方が開いていますが、システムをアイドル状態にしてもこのエラーが発生します。ソケット接続が中止されました。これは、メッセージの処理中にエラーが発生したか、リモートホストが受信タイムアウトを超過したか、基になるネットワークリソースの問題が原因で発生している可能性があります。ローカルソケットタイムアウトは'00:00:59.9479970 'でした。 – econner
ここには、channelfactoryとチャネルの作成を示すMSDNのリンクがあります。呼び出しを行い、チャネルを閉じて、チャネルファクトリを閉じます。しかし、信用証明を使用して認証を行う場合、各メソッド呼び出しの後にチャネルを閉じて、各メソッドがリソースと時間に高価になる前にチャネルを再作成しないでください。 http://msdn.microsoft.com/en-us/library/ms734681.aspx – econner
さらにテストした後、まずPrepareWCFConnection()を使用してWCFサービスへの呼び出しを開始し、次にサービスメソッドを呼び出してから(( IClientChannel)プロキシ).Close();これにより、チャネル接続が閉じられ、メソッド呼び出しごとに新しいチャネルが作成されます。これはベストプラクティスですか? – econner