C# 快速调用WCF服务时出错
我有一个WCF服务,它是用C从我的Silverlight 3应用程序调用的。该服务是为用户填充的列表框中的每个项目调用的。当列表框中只包含一项时,一切正常。多个项目有时会导致错误。我做了一些测试,有时我会在两个项目上出错,有时不会。使用4项测试,一次我得到2个返回结果,之后返回错误 最糟糕的是,这个错误只是说Remoteserver返回了一个错误:NotFound。该错误是一个CommunicationException,并在EndMethodSystem.IAsyncResult结果方法中抛出 这是电话:C# 快速调用WCF服务时出错,c#,wcf,silverlight,C#,Wcf,Silverlight,我有一个WCF服务,它是用C从我的Silverlight 3应用程序调用的。该服务是为用户填充的列表框中的每个项目调用的。当列表框中只包含一项时,一切正常。多个项目有时会导致错误。我做了一些测试,有时我会在两个项目上出错,有时不会。使用4项测试,一次我得到2个返回结果,之后返回错误 最糟糕的是,这个错误只是说Remoteserver返回了一个错误:NotFound。该错误是一个CommunicationException,并在EndMethodSystem.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,这些StoredProcedures处理每个SP更改为参数给定值的同义词对象。。。因此,我必须在那里修复它。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>
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>
您需要在呼叫服务后处理该服务。我有同样的问题,我用语句修复了它-
using (TempConvertService TMPConSvc =
new TempConvertService.TempConvertServiceClient())
{
result = TMPConSvc.ConvertToF(32.00);
return result;
}
您需要在呼叫服务后处理该服务。我有同样的问题,我用语句修复了它-
using (TempConvertService TMPConSvc =
new TempConvertService.TempConvertServiceClient())
{
result = TMPConSvc.ConvertToF(32.00);
return result;
}
所描述的问题一定很常见,解决方法肯定不是摆弄节流?客户机不会如此轻松地打开到同一台服务器的这么多连接,它肯定会在客户机上对这些请求进行排队,并且只有少数并发请求未完成。此外,OP有时仅用两个条目来描述问题,因此我无法确定油门的改变会有什么帮助。我怀疑详细的异常将揭示服务器端代码没有正确处理多个调用的并发性。安东尼,你完全正确。我已经准备好了serviceDebug属性,但是当使用Silverlight 3的WCF时,您必须更加努力才能真正获得错误:-在准备好这个属性之后,我发现错误是由WCF服务在SQL StoredProcess上的并发访问引起的。我使用同义词来查询具有相同结构的不同表。但那是另一个故事。。。所描述的问题一定很常见,解决方法肯定不是摆弄节流?客户机不会如此轻松地打开到同一台服务器的这么多连接,它肯定会在客户机上对这些请求进行排队,并且只有少数并发请求未完成。此外,OP有时仅用两个条目来描述问题,因此我无法确定油门的改变会有什么帮助。我怀疑详细的异常将揭示服务器端代码没有正确处理多个调用的并发性。安东尼,你完全正确。我已经准备好了serviceDebug属性,但是当使用Silverlight 3的WCF时,您必须更加努力才能真正获得错误:-在准备好这个属性之后,我发现错误是由WCF服务在SQL StoredProcess上的并发访问引起的。我使用同义词来查询具有相同结构的不同表。但那是另一个故事。。。叹气