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

pun*_*eet 6 c# wcf timeout .net-4.5

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

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

我的客户的代码如下所示

MyService.MyServiceClient myServiceClient = new MyService.MyServiceClient(context);
myServiceClient.GenericSendData("Save Req", serializedString, ServerIdentifier, null);
Run Code Online (Sandbox Code Playgroud)

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

brz*_*brz 5

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

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


Far*_*ina 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);
}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

 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);
 }
Run Code Online (Sandbox Code Playgroud)

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