2011-01-07 40 views
1

我在一個循環中重複調用WCF服務方法(每次迭代時使用不同的參數)並且它在大約40分鐘後導致超時。我使用相同的代理對象,只有在循環完成後才關閉它。我怎樣才能避免這個超時錯誤?是否需要爲每個呼叫實例化一個新的代理? (實際上,我在這裏調用SQL服務器報告服務器webservice並傳遞不同的參數來生成不同的報告,並且我沒有使用每個迭代的新代理,因爲它們可能會減慢報告的生成速度)。這裏的客戶端也是一個WCF服務,它託管在一個Windows服務中。在一個循環(使用相同的代理對象)中多次調用WCF服務方法導致超時

(這只是用於說明的例子,而不是發生故障的實際的代碼)

using(var proxy=new serviceclient()) 
{ 
    for(var i=0;i<50;i++) 
    { 
     proxy.methodName(i); 
    } 
} 

該錯誤消息是這樣的

System.TimeoutException:請求 信道定時等待00:01:00後回覆 。將傳遞給調用的超時值 增加到 請求或增加綁定上的SendTimeout值 值。分配給此操作的時間 可能有 是較長超時的一部分。 ---> System.TimeoutException:到 'http://localhost/ReportServer/ReportExecution2005.asmx' 的HTTP請求已超出分配的超時時間 00:01:00。分配給此 操作的時間可能是更長超時的一部分。 ---> System.Net.WebException:操作 超時

這裏是客戶端WCF配置

<bindings> 
    <basicHttpBinding> 
    <binding name="ReportExecutionServiceSoap" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost/ReportServer/ReportExecution2005.asmx" 
    binding="basicHttpBinding" bindingConfiguration="ReportExecutionServiceSoap" 
    contract="ReportExecutionServiceReference.ReportExecutionServiceSoap" 
    name="ReportExecutionServiceSoap" /> 
</client> 
(只關係到報告服務,而不是整個WCF配置的一部分)

回答

2

此問題現已解決。其中一個報告(通過調用報告服務器ASMX webservice生成)比平時耗時更長,導致超時,這不是由於循環中的調用數量所致(每個webservice調用都是同步的並且未排隊) 。爲了解決這個問題,我使用了標準的ASP.NET Web服務API,而不是WCF調用報表執行互聯網服務和設置超時爲無窮這樣

var webServiceProxy = new ReportExecutionServiceReference.ReportExecutionService() 
           { 
            Url = ConfigurationManager.AppSettings["ReportExecutionServiceUrl"], 
            Credentials = System.Net.CredentialCache.DefaultCredentials 
           }; 
    webServiceProxy.Timeout = Timeout.Infinite; 

超時可能已被設置爲一個較大的值,而不是無限以及。這個web服務在每個報告的循環中被調用,並且一次生成所有用戶選擇的報告大約需要兩個小時。客戶端是WCF服務並託管在Windows服務而不是IIS中以避免客戶端超時。感謝所有的答覆。

0

如果您正在從客戶端進行異步調用,並且服務器不是「webfarm」,則將在服務器上調用所有調用。這可能會導致呼叫超時。它並沒有真正說出你的代碼。

假設您正在通過一個包含10個項目的列表,每個響應需要10秒鐘才能在服務器上處理。由於您使用的是相同的代理,因此所有調用都將很快從客戶端代碼派發。但是,大約需要100秒才能返回所有答案(請注意,我沒有考慮到您有網絡延遲,對象實施等等) 這意味着所有在第6號後的呼叫都會超時。

如果服務器將有更多的線程可用於處理數據,這可以避免,但問題可能會彈出其他地方。你應該可以再次嘗試相同的呼叫,因爲超時也可能因爲任何其他原因而導致,網絡問題,臨時服務器過載等等。

我會強制製作某種quing系統,調度所有服務器來電,以便您可以再次進行相同的呼叫。這將如何實施取決於您的方案: 他們是否需要按特定順序發送? 您是否需要知道上次通話何時返回? 等

+0

這裏每個方法調用都是同步的,所以客戶端會等待直到生成報告,然後再發出請求另一個報告。現在我正試圖爲每個調用實例化並關閉代理,並查看它是否有效。謝謝回覆 – RKP 2011-01-09 13:24:23

1

這只是意味着您的服務器無法處理負載,或由於某些其他原因花費的時間過長。詢問服務器爲什麼需要太長時間;當客戶超時時不要感到驚訝。

0
Dim ws As WCFService.ServiceClient = New WCFService.ServiceClient 
ws.Endpoint.Binding.SendTimeout() = TimeSpan.FromSeconds(2) 
相關問題