由于Android WebView的更新版本(目前在v48上运行),pdf下载形式我的应用程序停止工作。 从桌面浏览器下载,WP10和iOS也能正常运行。
行为:
它说,下载已经开始......几分钟后我收到通知“下载失败”。
下载来自Azure上托管的WebApi控制器。我尝试了大量不同的建议https标题和标题组合。我还比较了来自其他网站的标题,其中下载适用于我的设备。没有成功。
我很好奇并在Asp.Net Mvc(5)控制器(同一项目)中删除了下载,并修改了它们与WebApi(2.2)对应物中完全相同的标题。的 =>下载工作!。比较Fiddler中的两个响应,除了Url - 它们看起来完全一样。
知道还有什么区别吗?
这里只是一些代码位:
MVC测试(工作)
public FileResult CoolDocument()
{
// Some hardcoded binary data (minimum valid pdf)
byte[] bytearr = new byte[] { 37, 80, ... };
// Making headers look the same as in the WebApi response
Response.AddHeader("Content-Disposition", "attachment; filename=\"test.pdf\"");
Response.Headers.Add("Expires", "-1");
Response.Headers.Add("Cache-Control", "no-cache");
Response.Headers.Add("X-Application-Version", "1.0.5919.31987");
Response.Headers.Add("X-Environment", "Acceptance");
Response.Headers.Add("Pragma", "no-cache");
return File(bytearr, "application/pdf");
}
WebApi测试(无法正常工作)额外的标题来自过滤器,但我也尝试过它们
[HttpGet]
public HttpResponseMessage CoolDocument()
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
/// Some hardcoded binary data (minimum valid pdf)
byte[] bytearr = new byte[] { 37, 80, ... };
response.Content = new ByteArrayContent(bytearr);
response.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/pdf");
response.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment") { FileName = "\"test.pdf\"", };
return response;
}
以下是Fiddler中标题的外观:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2729
Content-Type: application/pdf
Expires: -1
Server: Microsoft-IIS/8.0
X-Environment: Acceptance
X-Application-Version: 1.0.5919.31987
Content-Disposition: attachment; filename="test.pdf"
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Mar 2016 16:50:41 GMT
答案 0 :(得分:1)
终于弄清楚出了什么问题。
Android(以及Windows Phone 8.1)在开始下载时发出两个请求。
我假设,第一个来自浏览器(Chrome),第二个来自 android下载管理器。
第二个请求具有不同的请求标头,而不是原始请求。我开始远程调试服务器代码后才注意到第二个请求,因为下载管理器的请求逻辑上没有记录在chrome开发人员工具中。
无论如何,这第二个请求导致我的“语言过滤器”抛出异常,因为通过读出 Accept-Language Header 发生了一个哑空指针异常 - 这在第二个请求中不存在。