【问题标题】:Async ActionResult implementation is blocking异步 ActionResult 实现被阻塞
【发布时间】:2015-05-05 22:41:58
【问题描述】:

好的,

这里我有一个 MVC 4 应用程序,我正在尝试在其中创建一个异步 ActionResult。

目的:用户在网页上有一个下载PDF图标,下载需要很多时间。因此,当服务器忙于生成 PDF 时,用户应该能够在网页中执行一些操作。

(点击“下载PDF”链接正在向服务器发送ajax请求,服务器正在获取一些数据并正在推回PDF)

发生的情况是,当我调用 ajax 下载 PDF 时,它会启动该过程,但会阻止每个请求,除非它返回到浏览器。这是简单的阻塞请求。

到目前为止我已经尝试过什么。

1) 使用 AsyncController 作为控制器的基类。

2) 将 ActionResult 制作为异步任务 DownloadPDF(),在这里我将生成 PDF 的整个代码/逻辑包装到一个包装器中。这个包装器最终在 DownloadPDF() 中是一个可等待的东西

类似的东西。

public async Task<ActionResult> DownloadPDF()
{
    string filepath = await CreatePDF();
    //create a file stream and return it as ActionResult
}

private async Task<string> CreatePDF()
{
    // creates the PDF and returns the path as a string
    return filePath;
}

是的,操作是基于会话的。

我是不是在哪里遗漏了什么?

【问题讨论】:

    标签: asp.net-mvc-4 asynchronous actionresult async-await asynccontroller


    【解决方案1】:

    目的:用户在网页上有一个下载PDF图标,下载需要很多时间。因此,当服务器忙于生成 PDF 时,用户应该能够在网页中执行一些操作。

    async 不会这样做。正如我在my MSDN article 中所描述的,async 屈服于 ASP.NET 运行时,而不是客户端浏览器。这才有意义; async can't change the HTTP protocol(正如我在博客中提到的)。

    不过,虽然async 不能做到这一点,但 AJAX 可以。

    发生的情况是,当我调用 ajax 下载 PDF 时,它会启动该过程,但会阻止每个请求,除非它返回到浏览器。这是简单的阻塞请求。

    AFAIK,您发布的请求代码是完全异步的。它在创建 PDF 时将线程返回到 ASP.NET 线程池。但是,并发请求还有其他几个方面。特别是,一种常见的挂断是默认情况下 ASP.NET 会话状态不能在多个请求之间共享。

    1) 使用 AsyncController 作为控制器的基类。

    这是不必要的。现代控制器检查其操作的返回类型以确定它们是否是异步的。

    是的,操作是基于会话的。

    在我看来,ASP.NET 会话限制了您的请求。见Concurrent Requests and Session State。您必须将其关闭或设为只读才能在同一会话中拥有并发请求。

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 2018-04-06
      • 2017-05-08
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2020-10-28
      相关资源
      最近更新 更多