异步ActionResult实现阻塞

时间:2015-03-04 19:19:15

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

好,

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

目标:用户在WebPage上有一个下载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;
}

是,操作是基于会话的。

我错过了某些地方吗?

1 个答案:

答案 0 :(得分:4)

  

目标:用户在WebPage上有一个下载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。您必须将其关闭或将其设置为只读才能在同一会话中同时发出请求。