【问题标题】:Error when rapidly calling WCF service快速调用 WCF 服务时出错
【发布时间】:2009-12-10 12:04:18
【问题描述】:

我有一个 WCF 服务,它是从我的 Silverlight 3 应用程序(使用 C#)调用的。为用户填写的列表框中的每个项目调用该服务。当列表框中只包含一项时,一切正常。多个项目有时会导致错误。我进行了一些测试,有时我会收到 2 个项目的错误,有时不会。 4项测试,一次我得到2个结果返回,然后错误。

最糟糕的是,错误只是说“远程服务器已返回错误:未找到”。错误是“CommunicationException”,在 EndMethod(System.IAsyncResult result) 方法中抛出

来电:

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-Calls 的并发访问引起的。该服务调用与同义词对象一起使用的 StoredProcedures,每个 SP 更改为由参数给出的值......所以我必须在那里修复它。

【问题讨论】:

    标签: c# wcf silverlight


    【解决方案1】:

    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>
    

    【讨论】:

    • 所描述的问题一定很常见,解决办法不是摆弄节流吗?客户端不会轻易地打开到同一个服务器的这么多连接,它肯定会在客户端上对这些请求进行排队,并且只有几个并发请求未完成。此外,OP 有时只用两个条目描述问题,所以我不知道油门变化将如何帮助。我怀疑详细的异常会显示服务器端代码无法正确处理多个调用的并发。
    • 你说得对,安东尼。我已经有了 serviceDebug 属性,但是当使用 Silverlight 3 使用 WCF 时,你必须更加努力才能真正得到错误:msdn.microsoft.com/en-us/library/dd470096(VS.96).aspx - 在得到这个之后,我发现错误是由WCF 服务对 SQL-StoredProcedures 的并发访问。我使用同义词来查询具有相同结构的不同表。但那是另一回事了...
    【解决方案2】:

    您需要在调用该服务后对其进行处置。我有同样的问题,我用 using 语句修复了它-

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

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 2012-12-07
      • 2010-12-11
      • 2016-09-25
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多