使用WebAPI HttpResponseMessage时下载文件提示
我的API中有一个返回HttpResponseMessage的方法:
[HttpGet, HoodPeekAuthFilter] public HttpResponseMessage GlobalOverview() { try { StatsRepo _statsRepo = new StatsRepo(); string file = _statsRepo.IncidentData().AsCSVString(); if (file == null) { return Request.CreateResponse(HttpStatusCode.NoContent); } HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StringContent(file); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = "GlobalOverview.csv"; return result; } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError); } }
在我的MVC Web Apllication中,我有一个需要调用API并返回文件的控制器Action:
[Authorize] [HttpGet] public HttpResponseMessage GlobalOverview() { HttpResponseMessage file = new HttpResponseMessage(); using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(this.UserName + ':' + this.Password))); Task response = httpClient.GetAsync("api.someDomain/Reporting/GlobalOverview"); file = response.Result; } return file; }
如果我直接访问APIurl,它会提示我输入用户名和密码,然后会出现“保存文件”对话框,我可以下载该文件。
如果我导航到我的Web应用程序中的操作,然后我得到以下响应输出到屏幕:
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Pragma: no-cache X-SourceFiles: = XXXXXXX Content-Disposition: attachment; filename=GlobalOverview.csv Content-Type: application/octet-stream Expires: -1
我认为我需要返回一个FileResult,但我不知道如何将HttpResponseMessage转换为FileResult。
在MVC控制器中,您可以尝试返回FileResult,并使用File()方法读取API的响应作为字节数组。
[Authorize] [HttpGet] public FileResult GlobalOverview() { HttpResponseMessage file = new HttpResponseMessage(); using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(this.UserName + ':' + this.Password))); Task response = httpClient.GetAsync("api.someDomain/Reporting/GlobalOverview"); file = response.Result; } return File(file.Content.ReadAsByteArrayAsync().Result, "application/octet-stream", "GlobalOverview.csv"); }
- ASP.NET应用程序的高内存使用率
- 如何在DataAnnotation中本地化ErrorMessage?
- 如何使用Html.GetUnobtrusiveValidationAttributes()
- asp.net MVC“Action Method”是否可以在不声明参数的特定类型的情况下接收JSON? 如果是这样,怎么样?
- 在策略设计模式的情况下,Hangfire服务器无法选择作业
- 如何分析ASP.NET MVC应用程序中的请求性能?
- 如何在mvc3视图中调用foreach中的javascript函数
- ASP.NET MVC在发送状态为500的响应时显示错误页面
- mvc 5表中的SelectList,DropDownList为空值