そこで、(nettcpbinding を介して) WCF サービスを呼び出すコンソール アプリを作成しています。ビジネスでは、タイムアウト値として使用する値を指定できるようにしたいと考えています。私は最初に操作のタイムアウトを試みましたが、それは無視されたようだったので、他の値をたくさん試しました。それらの作品の1つ(または組み合わせ):)
タイムアウトした場合でもチャネルを閉じることができることを望んでいましたが、最後にブロックを閉じると、タイムアウトするまでさらに1分間待機します(タイムアウト値を秒単位で設定しています)。サーバー側のコードに遅延を追加してテストしています-しばらく時間がかかることをシミュレートします。
クローズを最初の try ブロックに移動できますが、チャネルを開いたままにしておくのではないかと心配しています。その後、タイムアウト エラーがユーザーにすばやく報告されます。または、スレッド化を実装する必要がありますか?
public static String ExecuteSearch(List<KeyValuePair<string, string>> paramItems)
{
var context = GetAdminContext();
var parsedParameters = ParseParameters((paramItems));
//TODO: Figure out how to implement timeout - & workout if port number will be passed in??
IPartyProfile partyProfile = null;
long start = System.Environment.TickCount;
using (ChannelFactory<IPartyController> factory = new ChannelFactory<IPartyController>("IPartyControllerEndpoint"))
{
EndpointAddress address = new EndpointAddress(String.Format("net.tcp://{0}/ServiceInterface/PartyController.svc", parsedParameters.HostName));
IPartyController proxy = factory.CreateChannel(address);
if (proxy != null)
{
var timeoutTimeSpan = new TimeSpan(0, 0, parsedParameters.TimeOut);
((IContextChannel)proxy).OperationTimeout = timeoutTimeSpan;
factory.Endpoint.Binding.SendTimeout = timeoutTimeSpan;
factory.Endpoint.Binding.ReceiveTimeout = timeoutTimeSpan;
factory.Endpoint.Binding.OpenTimeout = timeoutTimeSpan;
factory.Endpoint.Binding.CloseTimeout = timeoutTimeSpan;
try
{
// TODO: potentially call something more complex
partyProfile = proxy.GetLatestPartyProfile(context, parsedParameters.PartyId);
}
catch (EndpointNotFoundException ex)
{
throw new Exception(STATUS_UNKNOWN + ": Endpoint specified not responding", ex);
}
catch (TimeoutException ex)
{
throw new Exception(STATUS_UNKNOWN + ": Timeout exceeded", ex);
}
finally
{
try
{
((IClientChannel)proxy).Close();
}
catch (Exception)
{
}
}
}
}
long stop = System.Environment.TickCount;
long elapsed = (stop - start) / 1000; // in seconds
return SetResultMessage(elapsed, partyProfile, parsedParameters);
}
編集 - factory.Abort() を使用して、より迅速に終了できると思います。(上記のコードの Close の場所に配置します)。