2

好的,

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

Objective : 用户在网页上有一个下载PDF Icon,下载需要很多时间。因此,当服务器忙于生成 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;
}

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

我在哪里遗漏了一些东西吗?

4

1 回答 1

4

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

async不会这样做。正如我在我的 MSDN 文章中所描述的,async屈服于 ASP.NET 运行时,而不是客户端浏览器。这才有意义;async无法更改 HTTP 协议(​​正如我在博客中提到的那样)。

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

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

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

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

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

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

在我看来,ASP.NET 会话限制了您的请求。请参阅并发请求和会话状态。您必须将其关闭或将其设为只读,以便在同一会话中具有并发请求。

于 2015-03-04T19:56:46.543 回答