2009-12-10 121 views
1

我有一個WCF服務,這是從我的Silverlight 3應用程序(使用C#)調用的。爲用戶填充列表框中的每個項目調用該服務。當只有一個項目包含在列表框中時,一切正常。多個項目導致錯誤有時。我測試了一下,有時候我有兩個項目出錯,有時候沒有。用4項測試,有一次我得到2個結果返回,之後出現錯誤。快速調用WCF服務時出錯

最糟糕的是,錯誤只是說「遠程服務器返回了一個錯誤:NotFound」。錯誤是「的CommunicationException」,並在EndMethod(System.IAsyncResult結果)拋出方法

這裏的電話:

foreach (ListBoxItem lbItem in categorySeeds) 
{ 
    Helper.Instance.service.ClusterAsync(Helper.Instance.language.value, 
    ((KeyValuePair<string, int>)lbItem.Tag).Value, 
    Helper.Instance.clusterLevel, 
    Helper.Instance.clusterDelay, 
    Helper.Instance.clusterTolerance, 
    Helper.Instance.clusterMaxCategories, 
    Helper.Instance.similarity); 
} 

我記得通過調用「重用」我曾經「解決」問題包含我的WCF的AppPool的...所以也許配置有問題嗎?有誰知道我是否可以讓WCF返回比「NotFound」更有意義的錯誤信息?

由於提前, 弗蘭克

答:問題是由多重的WCF服務的調用的併發訪問造成的。服務調用StoredProcedures,它與同義詞 - 每個SP更改爲由參數給定的值的對象一起工作...所以我必須在那裏修復它。

回答

2

WCF服務器的最大併發呼叫數和併發會話數分別爲10和16。如果您撥打該服務的次數超過了該次數,則可能會超時和/或被拒絕。

這是一個服務行爲(serviceThrottling),這是在服務器上配置確實:

<serviceBehaviors> 
    <behavior name="YourServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     <serviceThrottling 
      maxConcurrentCalls="25" 
      maxConcurrentInstances="25" 
      maxConcurrentSessions="25"/> 
    </behavior> 
</serviceBehaviors> 

你從WCF後面的一般錯誤消息完全是故意的 - 在WCF設計者並不想透露任何可能會幫助他利用系統的外部呼叫者。

<serviceBehaviors> 
    <behavior name="YourServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
    </behavior> 
</serviceBehaviors> 
+0

描述必須是相當普遍的問題,想必解決方案是不反覆折騰節流?客戶端不會輕易地打開如此多的連接到同一臺服務器,它肯定會將這些請求排隊在客戶端上,並且只有少數併發請求未完成。另外,OP有時僅用兩個條目描述問題,所以我不能確定油門變化將如何幫助。我懷疑詳細的例外情況會揭示服務器端代碼沒有正確處理多個調用的併發。 – AnthonyWJones 2009-12-10 14:35:32

+0

你是絕對正確的,安東尼。我已經有了serviceDebug屬性,但是當使用Silverlight 3使用WCF時,您必須更加努力才能真正獲得錯誤:http://msdn.microsoft.com/zh-cn/library/dd470096(VS .96).aspx - 得到這個之後,我發現這個錯誤是由WCF-Service在SQL-StoredProcedures中的併發訪問引起的。我使用同義詞來查詢具有相同結構的不同表格。但這是另一個故事...... *嘆* – Aaginor 2009-12-10 16:23:58

2

你需要調用後處置服務:那個,也可以通過服務行爲,然後返回一個更有意義的錯誤消息,您扭捏。我有同樣的問題,我用的語句固定它 -

using (TempConvertService TMPConSvc = 
new TempConvertService.TempConvertServiceClient()) 
{ 
result = TMPConSvc.ConvertToF(32.00); 
return result; 
}