【问题标题】:Why is async Web Service call not responding?为什么异步 Web 服务调用没有响应?
【发布时间】:2016-02-24 12:44:50
【问题描述】:

我有一个 Web 服务,我目前正在从两个不同的应用程序 WPF 和 MVC 访问它。在这两个应用程序中,我都调用了自动生成的异步 Web 服务方法。

到目前为止,WPF 应用程序运行良好,但是当从 MVC 应用程序调用相同的异步 Web 方法时,Web 服务永远不会响应。该服务的跟踪几乎是空的,在调试时我可以看到该方法正在终止,因为它应该是。 此外,可以毫无问题地从 mvc 应用程序调用不同的异步方法。 绑定和端点的配置在两个应用程序中完全相同。

这真的把我吓坏了,因为这种行为看起来很随意,我就是不知道出了什么问题。 非异步调用有效,甚至可以从 MVC 应用程序调用其他异步方法。

这就是我调用方法的方式:

try 
{
    var result = await this._serviceChannel.GetResultsAsync(newerThan);
    return result;
}
..

这就是服务的方法:

[OperationContract(Action = "GetChangedResults", ReplyAction = "GetChangedResults")]
[PrincipalPermission(SecurityAction.Demand, Role = "GetResults")]
public IEnumerable<Results> GetChangedResults(DateTime newerThan)
{
    using (ResultUnitOfWork ruow = new ResultUnitOfWork())
    {
        return ruow.GetChangedResults(newerThan);
    }
}

有什么想法或建议吗? 谢谢和问候

编辑:

我已将方法主体更改为在调用后直接返回 NULL - 也没有响应:

public IEnumerable<DcLecturer> GetChangedLecturers(DateTime newerThan)
{
    return null;
}

【问题讨论】:

  • 服务是如何产生的?您可以发布服务的实际代码吗? GetResultsAsync 的

标签: c# wcf asynchronous


【解决方案1】:

这是典型的僵局情况。 等待结果时使用ConfigureAwait

try 
{
    var result = await this._serviceChannel.GetResultsAsync(newerThan).ConfigureAwait(false);
    return result;
}

http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

【讨论】:

  • 您在哪里看到了死锁?他没有在发布的任何代码中调用.Result.Wait
  • 为什么你认为使用await会导致死锁?
  • 成功了。太感谢了!使用 await 不等于 ConfigureAwait,但是 ConfigureAwait 会在等待失败时跳进去,(非常)广义地说 - 这是真的吗?
  • .. 感谢您的链接 - 将是我的下一个问题 :)
  • 那么这就是真正的问题。这不是await,而是他在异步方法调用上同步阻塞的事实,这是他不应该做的。 ConfigureAwait(false) 是一种解决方法,但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多