【问题标题】:Asynchronous WCF service blocks ASP application异步 WCF 服务阻止 ASP 应用程序
【发布时间】:2011-07-04 22:31:17
【问题描述】:

我有一个调用 WCF 服务的 ASP (MVC2) 应用程序。该服务需要很长时间,所以我不希望客户端 ASP 应用程序等待它完成。它将其状态记录在数据库中,供 ASP 客户端使用。
我正在异步调用该服务,但是当它尝试转换到下一页时,我的 ASP 应用程序仍然挂起。我怀疑这是因为线程挂起等待服务回复。 实现此接口以使 ASP 应用程序可以继续运行而不被阻塞的最佳方法是什么?

【问题讨论】:

    标签: asp.net wcf asynchronous blocking


    【解决方案1】:

    如果您不想知道 Web 服务调用的结果,则不需要异步调用。您需要一种方式(也称为即发即弃)调用。将IsOneWay=true 添加到您的OperationContract 喜欢:

    [ServiceContract]
    public interface MyServiceContract
    {
      [OperationContract(IsOneWay=true)]
      void MyOperation(Data data);
    }
    

    单向操作必须返回void。客户端只会等待建立连接并发送数据。它不会等待处理结束。

    【讨论】:

    • 正如 Ladislav 所说,客户端只会等待足够长的时间来建立连接并发送请求,但它仍在等待。如果您在客户端配置了较长的超时并且服务器没有响应,那么您的 ASP.NET 线程将阻塞到客户端超时值。因此,要么将您的客户端超时配置为相对较短,要么分拆一个新线程来进行每次调用。
    • 我不知道单向选项。我以不同的方式解决了这个问题。我在服务中启动了一个新线程并让它完成工作。同时,收到请求的线程立即返回给客户端。这将客户端与服务分开,让它们并行处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多