在点网核心2.1项目中如何增加WCF服务的超时值

时间:2018-10-29 13:19:49

标签: wcf asp.net-core .net-core visual-studio-2017

我之所以发布此消息,是因为我无法在Stack Overflow上找到任何位置来解决该问题,因为该问题通过使用Connected Services添加服务引用来解决了使用WCF的.Net-Core项目。

我的问题是,由于长时间运行的操作请求,我面临客户端超时。

因此,由于.Net-Core不再使用Web配置存储WCF服务引用的配置值了,因此如何增加wcf客户端对象的超时值? (请参阅我提供的答案)

3 个答案:

答案 0 :(得分:2)

在解决方案资源管理器中的“已连接的服务”下,添加WCF服务后,将为该服务生成一些文件。您应该看到一个文件夹,该文件夹的名称是您给WCF服务引用的名称,并在其下有一个Getting StartedConnectedService.json和一个Reference.cs文件。

要增加任何客户端服务对象的超时值,请打开Reference.cs并找到方法:GetBindingForEndpoint

在此方法中,您应该看到类似以下内容的

if ((endpointConfiguration == EndpointConfiguration.BasicHttpBinding_IYourService))
            {
                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
                result.MaxBufferSize = int.MaxValue;
                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
                result.MaxReceivedMessageSize = int.MaxValue;
                result.AllowCookies = true;
                //Here's where you can set the timeout values
                result.SendTimeout = new System.TimeSpan(0, 5, 0);
                result.ReceiveTimeout = new System.TimeSpan(0, 5, 0);

                return result;
            }

只需使用result.和您要增加的超时,例如SendTimeoutReceiveTimeout等,然后将其设置为具有所需超时值的新TimeSpan。

我希望这对某人来说是有用的帖子。

答案 1 :(得分:2)

只需在生成的代理类中实现以下部分方法即可配置服务端点。将部分方法放在您自己的文件中以确保它不会被覆盖。

static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials);

答案 2 :(得分:1)

Ryan Wilson的回答将起作用,但仅在您尝试更新服务之前。 Reference.cs将被覆盖。 在.NET Core 3.1中,您可以在语法上修改绑定超时:

 public MemoqTMServiceClass(string api_key)
    {
        
        client = new TMServiceClient();
        
        var eab = new EndpointAddressBuilder(client.Endpoint.Address);

        eab.Headers.Add(
              AddressHeader.CreateAddressHeader("ApiKey",  // Header Name
                                                 string.Empty,           // Namespace
                                                 api_key));  // Header Value

        client.Endpoint.Address = eab.ToEndpointAddress();
        client.Endpoint.Binding.CloseTimeout = new TimeSpan(2, 0, 0);
        client.Endpoint.Binding.OpenTimeout = new TimeSpan(2, 0, 0);
        client.Endpoint.Binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
        client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 10, 0);
    }