我有一个WCF服务,从我的Silverlight 3应用程序(使用C#)调用。为用户填充的列表框中的每个项目调用该服务。当列表框中只包含一个项目时,一切正常。多个项目会导致错误有时。我测试了一下,有时我得到2项错误,有时不会。有4个项目测试,有一次我得到2个结果返回,之后是错误。
最糟糕的是,错误只是说“Remoteserver返回了一个Error:NotFound”。 Error是一个“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-Service-Call的并发访问引起的。该服务调用与同义词对象一起使用的StoredProcedures,每个SP更改为参数给出的值...所以我必须在那里修复它。
答案 0 :(得分: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>
答案 1 :(得分:2)
调用后需要处理该服务。我有同样的问题,我使用声明 -
修复它using (TempConvertService TMPConSvc =
new TempConvertService.TempConvertServiceClient())
{
result = TMPConSvc.ConvertToF(32.00);
return result;
}