WCF クライアントのタイムアウトを短くする方法。WCF サービスを定期的に呼び出して、利用可能かどうかを確認したいと考えています。サービス メソッドの呼び出しを 1 秒以内にしてほしい。さまざまなタイムアウトを操作しようとしていますが、いずれの場合も 20 秒以上実行されています。
以下に私のコードがあります:
サービス:
[ServiceContract]
public interface ICustomerManager
{
[OperationContract]
void StoreCustomer(string customerName);
[OperationContract]
void Ping();
}
[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class CustomerManager : MarshalByRefObject, ICustomerManager
{
public void StoreCustomer(string customerName)
{
if(customerName == null) throw new ArgumentNullException("customerName");
Console.WriteLine(customerName + " stored.");
}
public void Ping()
{
}
}
クライアント:
var binding = new NetTcpBinding(SecurityMode.None);
binding.OpenTimeout = TimeSpan.FromSeconds(1);
binding.SendTimeout = TimeSpan.FromSeconds(1);
binding.ReceiveTimeout = TimeSpan.FromSeconds(1);
binding.CloseTimeout = TimeSpan.FromSeconds(1);
binding.ReliableSession.Enabled = true;
var bindingElements = binding.CreateBindingElements();
var tcpBindingElement = bindingElements.Find<TcpTransportBindingElement>();
tcpBindingElement.ChannelInitializationTimeout = TimeSpan.FromSeconds(1);
var factory = new ChannelFactory<ICustomerManager>(binding, "net.tcp://10.68.117.19:9998/CustomerManager");
var customerManager = factory.CreateChannel();
var contextChannel = customerManager as IClientChannel;
contextChannel.OperationTimeout = TimeSpan.FromMilliseconds(1000);
var start = DateTime.Now;
try
{
customerManager.Ping();
}
catch (CommunicationException)
{
var elapsed = DateTime.Now - start;
Console.WriteLine("elapsed: {0}", elapsed);
}
出力は次のとおりです。 elapsed: 00:00:20.8662525
1秒以内に実行する方法。
サーバーのコードを添付していないのは、使用できないケースをテストしているためです。
msdn フォーラムのリンクで非常によく似た問題が見つかりましたが、残念ながら、そこでも機能しません。