针对同一WCF服务的不同请求的不同超时

时间:2014-10-14 11:43:57

标签: c# wcf timeout .net-4.5

我有一个带有https绑定和回调的WCF服务。该服务在客户端中作为服务引用引用。超时在服务和客户端的配置文件中定义。

我需要使用比其他函数使用的默认值更小的超时值来调用服务中的函数。

我的客户端的代码如下所示

MyService.MyServiceClient myServiceClient = new MyService.MyServiceClient(context);
myServiceClient.GenericSendData("Save Req", serializedString, ServerIdentifier, null);

如何更改客户端/服务器中的代码,以便对特定功能的请求使用较小的超时值?我可以根据我调用的函数指定和更改代码中的超时吗?

2 个答案:

答案 0 :(得分:4)

是。只需在您的客户端上设置SendTimeout即可。要为特定服务调用设置10秒超时,您可以使用此示例:

using(MyService.MyServiceClient myServiceClient = new MyService.MyServiceClient(context))
{
    myServiceClient.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(10);
    myServiceClient.GenericSendData("Save Req", serializedString, ServerIdentifier, null);
}

答案 1 :(得分:2)

关于客户端,您可以以编程方式操作绑定并为每个服务客户端实例设置客户端超时。我们的想法是拥有不同的绑定配置,然后传递ServiceClient构造函数中所需的绑定。

以下是实例化BasicHttpBinding对象,为第一个服务客户端实例设置30秒超时,然后将下一个服务客户端实例的超时更改为5秒的示例:

var customBinding = new BasicHttpBinding()
{
    ReceiveTimeout = TimeSpan.FromSeconds(30), 
    SendTimeout = TimeSpan.FromSeconds(30),
    CloseTimeout = TimeSpan.FromSeconds(30),
    OpenTimeout = TimeSpan.FromSeconds(30) 
};

var endpointAddress = new EndpointAddress("http://localhost:6670/Service1.svc");

using (var client = new Service1Client(customBinding, endpointAddress))
{
    var data = client.GetData(100);
}

customBinding.OpenTimeout = TimeSpan.FromSeconds(5);
customBinding.CloseTimeout = TimeSpan.FromSeconds(5);
customBinding.SendTimeout = TimeSpan.FromSeconds(5);
customBinding.ReceiveTimeout = TimeSpan.FromSeconds(5);

using (var client = new Service1Client(customBinding, endpointAddress))
{
    var data = client.GetData(101);
}

或者您可以通过配置来完成:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService1_Shorter" openTimeout="00:00:05"
     closeTimeout="00:00:05"
     sendTimeout="00:00:05"
     receiveTimeout="00:00:05"/>
    <binding name="BasicHttpBinding_IService1_Longer" openTimeout="00:00:30"
       closeTimeout="00:00:30"
       sendTimeout="00:00:30"
       receiveTimeout="00:00:30"/>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:6670/Service1.svc" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_IService1_Longer" contract="ServiceReference1.IService1"
      name="BasicHttpBinding_IService1_Longer" />
  <endpoint address="http://localhost:6670/Service1.svc" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_IService1_Shorter" contract="ServiceReference1.IService1"
      name="BasicHttpBinding_IService1_Shorter" />
</client>
</system.serviceModel>

然后您将实例化客户端以使用不同的配置:

 using (var client = new Service1Client("BasicHttpBinding_IService1_Longer"))
 {
     var data = client.GetData(100);
 }

 using (var client = new Service1Client("BasicHttpBinding_IService1_Shorter"))
 {
     var data = client.GetData(101);
 }

关于服务器,不可能,并且绝对不是一个好主意,在每个请求的基础上更改正在运行的WCF服务的超时,并且它没有意义。一种可能是使不同的端点覆盖不同的操作,并且每个端点可以具有不同的服务器超时设置。