在MVC 4和c#中对RESTful HTTP请求使用异步等待

本文关键字:请求 异步 等待 HTTP RESTful MVC 中对 | 更新日期: 2023-09-27 18:16:04

期望结果:用户选择通过rest调用下载报告选项后,可能需要很长时间,一个新的选项卡打开一个消息说"请等待"我想返回控制回到浏览器,这样用户可以点击离开"请等待"浏览器选项卡回到窗口打开器浏览器选项卡,继续浏览网站。我组合在一起的代码运行了,但没有产生期望的结果,它的行为方式与我的代码的非异步版本相同——也就是说,用户的打开器选项卡保持绑定状态,直到调用完成下载。我尝试过其他模式,但都有相同的结果-没有我期望的异步行为。我想做的事可能吗?如果可能,我还有什么不明白的地方?

c#代码:

    public class ReportsController : Controller
    {
        public async Task GetDownloadAsync(string docId, string docName, string startDate, string endDate, string format)
        {
            //make request:
            HttpWebRequest GETRequest = (HttpWebRequest)WebRequest.Create("http://myServerAddress");
            GETRequest.Method = "GET";
            GETRequest.ProtocolVersion = HttpVersion.Version11;
            GETRequest.Accept = CreateHeader(format);
            Task<WebResponse> getResponseTask = GETRequest.GetResponseAsync();
            WebResponse GETResponse = await getResponseTask;
            (HttpWebResponse)GETRequest.GetResponse();
            Stream GETReponseStream = GETResponse.GetResponseStream();
            //retrieve response into byteArray:
            byte[] responseByteArray = convertStreamToByteArray(GETReponseStream);
            string fileName = string.Format("{0}-{1}.{2}", docName, DateTime.Now.ToString("o"), CreateFileExt(format));
            Response.ClearContent();
            Response.ContentType = CreateHeader(format);
            Response.AddHeader("Content-Disposition", "attachment; filename='"" + fileName + "'"");
            Response.AddHeader("Content-Length", GETResponse.ContentLength.ToString());
            Response.BinaryWrite(responseByteArray);
        }
    }

我从一些javascript的cshtml视图中调用这个控制器函数,像这样:

var win = window.open(encodeURI("GetDownloadAsync?docId=" + docId + "&docName=" + docName + "&startDate=" + startDate + "&endDate=" + endDate + "&format=" + reportType));

在MVC 4和c#中对RESTful HTTP请求使用异步等待

尽管我相信我已经正确地实现了异步,但似乎它仍然不起作用。而不是实现异步,我能够通过操纵。net处理会话状态的方式来实现期望的行为,用:

装饰控制器类:
[SessionState(SessionStateBehavior.ReadOnly)]

这为我提供了所需的"异步"行为,即启动映射到控制器方法的选项卡的效果,该控制器方法通过RESTful调用来下载大文件,而在下载文件时不再阻止浏览站点的其他部分。

每https://msdn.microsoft.com/en-us/library/ms178581%28v=vs.140%29.aspx

访问ASP。. NET会话状态在每个会话中是独占的,这意味着如果两个不同的用户并发请求,访问每个请求单独的会话被并发授予。但是,如果两个并发对同一个会话发出请求(通过使用相同的SessionID)第一个请求获得对会话的独占访问权信息。第二个请求只在第一个请求之后执行完成为止。(如果独占,第二个会话也可以获得访问释放信息上的锁,因为第一个请求超过) 如果@页面中的EnableSessionState值指令被设置为ReadOnly,这是对只读会话的请求信息不会导致会话数据上的独占锁。但是,会话数据的只读请求可能仍然需要等待为会话数据清除的读写请求所设置的锁。