【问题标题】:Async call to WCF Service fails silently and randomly对 WCF 服务的异步调用以静默方式随机失败
【发布时间】:2012-01-25 11:45:30
【问题描述】:

我已经在这个问题上工作了几天,似乎找不到解决方案:(

我有一个对 WCF 服务的异步调用,它有时会工作,而在其他情况下绝对不会做任何事情 - 没有调用,没有错误,什么都没有。它会在我的调用方法(主线程)执行后停止。 断点已添加到服务方法和自动生成的代理类中。如果我正在调试失败的调用,这些断点将永远不会被命中。其他时候(当它碰巧起作用时)所有断点都会被击中。

我已完全删除该服务并再次添加它,但仍然没有运气。 我什至添加了一个新的服务方法和请求消息对象,希望它是原来的一个奇怪的问题,但是我也遇到了新插入的方法同样的问题。

请注意 - 当我将应用程序发布到虚拟机时,此问题会更频繁地发生。它在我的本地机器上并没有发生太多,但它仍然会发生。

这是我的代码示例:-

这是对服务的异步调用;

ValidateUpdatesMessageRequest request = new ValidateUpdatesMessageRequest();
_serviceClient.ProcessUpdatesAsync(Request)

服务方法是这样的;

public ValidateUpdatesMessageResponse ProcessUpdates(ValidateUpdatesMessageRequest request){ 
//method body 
}

我还有一个服务接口,看起来像这样;

[OperationContract]
ValidateUpdatesMessageResponse ProcessUpdates(ValidateUpdatesMessageRequest request);

我会感谢任何可能有助于引导我找到解决方案的反馈。

如果您需要任何进一步的信息,请告诉我。

非常感谢!

【问题讨论】:

  • 嘿@Dave,我们在 SL 和 WCF 服务中遇到了类似的情况。我不知道确切原因,但是对服务进行了大量的顺序调用,尤其是当服务器端的操作是重,造成了这种行为。。你的情况类似吗?
  • 你能发布你的服务的代码和配置吗?
  • 嗨@Zortkun,感谢您的回复。实际上似乎没有与此问题相关的任何模式。对 Web 服务的调用是处理已经/需要更新的记录,所以我们可能一次只处理一条记录,它会失败,有时我们可以处理 20 条记录,它会工作,反之亦然!你采取了哪些措施来解决这个问题?谢谢。
  • @Dave 我想我们在阅读完这篇文章后得出了一个结论 (forums.silverlight.net/t/174322.aspx/1/10) ... 然后我们在彼此完成后开始打电话.. :/ 但我想你不会想要那个呵呵。
  • 嗨@Rajesh,来自客户端的调用如下所示:- _serviceClient.ProcessUpdatesAsync(request) 服务中的方法如下所示:- public ValidateUpdatesMessageResponse ProcessUpdates(ValidateUpdatesMessageRequest request) { //method我还有一个服务接口,如下所示:- [OperationContract] ValidateUpdatesMessageResponse ProcessUpdates(ValidateUpdatesMessageRequest request);

标签: .net wcf silverlight web-services


【解决方案1】:

发生这种情况有 3 个基本原因:

  1. 服务崩溃,因此永远不会发送回复。检查服务器端的日志。
  2. 网络问题导致呼叫无法返回。尝试使用 wireshark 监控网络流量。
  3. 电话回来了,但没有人在听。如果本应接收回复的代码超出范围,则会发生这种情况。进行代码审查以查找此问题。

希望这会有所帮助。

【讨论】:

  • 嗨@Shiraz 我应该提到这一点,但是我在整个应用程序中多次调用该服务,并且来自同一个类,它们工作得非常好。只有这一个电话。我创建了另一种方法并更新了服务,但没有运气。我还使用 Fiddler 来监控网络 - 我可以看到对服务的调用被中止,没有其他错误消息,但是我从 Fiddler 应用程序重新发送了完全相同的 SOAP 消息,它击中了服务!无法解释。还有其他想法吗?感谢您的宝贵时间!
  • @Shiraz,如果服务在服务器上崩溃,那么事件日志中不应该自动写入服务失败的内容吗?
【解决方案2】:

我现在实际上已经解决了我的问题。

我想我会将我的解决方案发布给可能遇到同样问题的其他人。

在我调用异步方法的方法结束时:-

_serviceClient.ProcessUpdatesAsync(request);

我有一个

CleanUp()

调用了

_serviceClient.CloseAsync();

所以它在服务方法运行之前被关闭了。

我只是拿了

CleanUp() 

从服务的原始方法调用中取出并将其放在事件完成方法中,这样异步线程在完成时关闭。 现在看起来很明显!

感谢您的所有建议和意见,非常感谢!

【讨论】:

    【解决方案3】:

    有类似的问题。在我的情况下,原因是绑定的 readerQuotas 中的 ma​​xArrayLength 值太低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多