2009-12-10 162 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; 
}