增加IIS服务器上托管的WCF服务的超时

时间:2013-11-19 11:36:58

标签: sql-server wcf iis

我的服务器上托管了一堆WCF服务。一个服务负责文件传输,并在用户尝试上传大文件时超时。

我想给用户一个选项,如果他愿意,可以增加这个特定服务的超时值。目前,我正在使用5分钟超时,但是当文件很大并且网络两侧的网络相对较慢时,会达到此限制。

有没有办法动态地这样做?我可以在不影响其他服务的情况下增加一项服务的超时值吗?

我理想的目标是从用户获取值并相应地设置clientTimeout和serverTimeout值。我已经能够设置客户端超时,但服务器超时是目前的限制。有什么想法吗?

我已阅读这些文章,但无法找到在运行时增加服务超时的方法 1. http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.executiontimeout.aspx
2。 WCF service timeout
3. http://blogs.msdn.com/b/wenlong/archive/2008/03/10/why-changing-sendtimeout-does-not-help-for-hosted-wcf-services.aspx

2 个答案:

答案 0 :(得分:1)

您可以配置(通过XML或代码)具有特定超时的端点。这是在servicehost启动时设置的,运行时无法更改。

同样不,客户端无法设置服务超时,因为这会使拒绝服务攻击变得非常容易。

最好隔离“文件上传服务”并相应地配置其端点。

答案 1 :(得分:0)

通常,超时问题发生在客户端,而不是主机上。本质上,客户端发送请求但主机不及时返回响应,并且(我认为默认为2分钟)超时发生。

您可以在运行时为每项服务增加或减少超时设置,并将服务定义为唯一的URL:port / Class / Method,但要这样做,您必须在运行时定义服务,绑定等,而不是使用您经常看到的标准web.config。

在主机上,您可以这样设置:

Dim ServiceHostURI As New Uri(sURL)
Dim ServiceHost As New ServiceHost(GetType(YourClass), ServiceHostURI)
Dim sError As String = Nothing
Dim ServiceHostEndPoint As EndpointAddress = New EndpointAddress(ServiceHostURI)
Dim b As BasicHttpBinding

'binding timeoutsettings
  b = New BasicHttpBinding(BasicHttpSecurityMode.None)
  'thirty minutes
  Dim specialTimeSpan = New TimeSpan(0, 30, 0)       
  b.CloseTimeout = specialTimeSpan
  b.ReceiveTimeout = specialTimeSpan
  b.SendTimeout = specialTimeSpan
  b.OpenTimeout = specialTimeSpan

'other binding settings
  b.TransferMode = TransferMode.Buffered
  b.MaxReceivedMessageSize = Integer.MaxValue
  b.MessageEncoding = WSMessageEncoding.Text
  b.TextEncoding = System.Text.Encoding.UTF8
  ServiceHost.AddServiceEndpoint(GetType(YourClass), binding, ServiceHostEndPoint.ToString)
  ServiceHost.Open()

在客户端,您可以这样设置超时:

    Dim hbe As New System.ServiceModel.Channels.HttpTransportBindingElement()
    hbe.MaxBufferSize = Integer.MaxValue
    hbe.MaxBufferPoolSize = Integer.MaxValue
    hbe.MaxReceivedMessageSize = Integer.MaxValue

    binding.Elements.Add(hbe)
    binding.SendTimeout = New TimeSpan(0, 30, 0)
    binding.ReceiveTimeout = New TimeSpan(0, 30, 0)

这个方法很好用的是你可以在代码中动态设置超时,但改变(显然)只发生在设置上。在服务运行时,您无法更改超时。 希望,这是一个帮助。