2012-01-11 72 views
2

運行調用WCF服務的MVC網站。
2臺不同機器上的網站和服務。
.NET框架4; IIS 7.無法說明的WCF服務超時

生產站點在不應該時遇到超時。我創建了最簡單的樣本(簡單的網站調用服務方法,延遲後返回「喂媽媽」),並能夠重現問題。這是怎麼回事:

  • 客戶端的web應用程序有它的綁定的SendTimeout設置爲6分鐘。
  • 服務器服務除了向文件寫入消息,休眠5分鐘,寫入另一條消息之外什麼也不做。
  • 寫入服務器上的文件的消息是正確的;服務器追蹤顯示沒有問題。
  • 客戶端永遠不會從服務器服務方法接收返回值。就像它失去了與服務器的連接。
  • 客戶端在6分鐘後拋出TimeoutException(任何大於此值的超時都會進一步延遲異常)。 如果我將服務器上的線程休眠時間更改爲4分鐘,則一切正常。這是可重複的,沒有其他人在搞這個測試場景。

因此,這裏的客戶端的相關配置部分:

<binding name="BasicHttpBinding_IService1" 
      closeTimeout="00:6:00" 
      openTimeout="00:6:00" 
      receiveTimeout="00:6:00" 
      sendTimeout="00:6:00" 
      allowCookies="false" 
      bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" 
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" 
      textEncoding="utf-8" 
      transferMode="Buffered" 
      useDefaultWebProxy="true"> 

<httpRuntime executionTimeout="1200" 
      maxRequestLength="10240" /> 

    <serviceBehaviors> 
    <behavior> 
     <serviceTimeouts transactionTimeout="00:6:00" /> 
    </behavior> 
    </serviceBehaviors> 

同樣的值出現在服務器上。 以下包括我試過的東西:

  • 添加了上面的serviceTimeouts元素。
  • 確保在客戶端代理類上調用close(即使這不會成爲我每次發生錯誤時的問題)。
  • 顯式創建一個通道,將其轉換爲IContextChannel並設置OperationTimeout(如概述here)。
  • 增加IIS中服務器應用程序池的FailureInterval屬性。
  • 確保配置中綁定元素的所有超時值全部設置爲大於服務方法所用時間的值。
  • 創建一個ChannelFactory並將其設置爲Endpoint.Binding.SendTimeout值。
  • 確保在客戶端和服務器上設置了編譯debug =「false」(讀取超時值[不確定哪些超時值]沒有正確遵守,除非設置了此值)。
  • 增加了maxBufferSize,maxBufferPoolSize和maxReceivedMessageSize,即使這與問題無關(服務器只是返回「hi mom」)。
  • 在客戶端代理上的代碼中顯式設置SendTimeout(因爲這應該是相關的超時)。
  • 從控制檯應用程序調用服務(相同結果)。

我還能試試嗎?

[編輯] 將服務移至與Web應用程序相同的機器,問題消失。

回答

1

這是生產環境中防火牆上的HTTP策略:最大請求時間5分鐘。