好,
这里我有一个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;
}
是,操作是基于会话的。
我错过了某些地方吗?
答案 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。您必须将其关闭或将其设置为只读才能在同一会话中同时发出请求。