簡體   English   中英

增加IIS服務器上托管的WCF服務的超時

[英]Increase timeout of WCF service hosted on IIS server

我的服務器上托管了一堆WCF服務。 一種服務負責文件傳輸,並在用戶嘗試上傳大文件時超時。

我想給用戶一個選擇,如果他願意,可以增加此特定服務的超時值。 目前,我正在使用5分鍾的超時時間,但是當文件較大且網絡兩端相對較慢時,就會達到此限制。

有沒有辦法動態地做到這一點? 我可以增加一項服務的超時值而不影響其他服務嗎?

我理想地想要實現的是從用戶那里獲取值,並相應地設置clientTimeout和serverTimeout值。 我已經能夠設置客戶端超時,但是到目前為止服務器超時是一個限制。 有什么想法嗎?

我已經閱讀了這些文章,但無法找到增加運行時服務超時的方法
1. http://msdn.microsoft.com/zh-cn/library/system.web.configuration.httpruntimesection.executiontimeout.aspx
2. WCF服務超時
3. http://blogs.msdn.com/b/wenlong/archive/2008/03/10/why-changing-sendtimeout-does-not-help-for-hosted-wcf-services.aspx

您可以配置 (通過XML或代碼)具有特定超時的終結點。 此設置是在servicehost啟動時設置的,運行時無法更改。

同樣,客戶端不能設置服務超時,因為這會使拒絕服務攻擊變得非常容易。

最好隔離“文件上傳服務”並相應地配置其端點。

通常,超時問題發生在客戶端上,而不是主機上。 從本質上講,客戶端發送了一個請求,但主機沒有及時返回響應,並且發生了(我認為默認為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)

這種方法的好處是您可以在代碼中動態設置超時,但是更改(顯然)僅在設置時進行。 服務運行時,您無法更改超時。 希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM