在Android设备上从WebApi服务的下载失败,适用于Asp.Net MVC

时间:2016-03-17 08:20:57

标签: android asp.net-mvc asp.net-web-api download

由于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

1 个答案:

答案 0 :(得分:1)

终于弄清楚出了什么问题。

Android(以及Windows Phone 8.1)在开始下载时发出两个请求。 我假设,第一个来自浏览器(Chrome),第二个来自 android下载管理器。 第二个请求具有不同的请求标头,而不是原始请求。我开始远程调试服务器代码后才注意到第二个请求,因为下载管理器的请求逻辑上没有记录在chrome开发人员工具中。
无论如何,这第二个请求导致我的“语言过滤器”抛出异常,因为通过读出 Accept-Language Header 发生了一个哑空指针异常 - 这在第二个请求中不存在。