从ASP.NET操作返回文件时的ERR_SPDY_PROTOCOL_ERROR

时间:2017-03-22 13:21:51

标签: c# asp.net angularjs asp.net-web-api asp.net-web-api2

我有一些旧的Web API操作方法,它返回CSV文件。它工作了很长时间,但最近停止了。现在它会导致ERR_SPDY_PROTOCOL_ERROR。

Chrome中的ERR_SPDY_PROTOCOL_ERROR通常与Avast安全相关联,如here所述。但就我而言,它不是由Avast引起的,其他网络浏览器也会抛出异常。

我的行动方法如下:

[HttpGet]
[Route("csv")]
public HttpResponseMessage SomeMethod([FromUri]SomeSearchCriteria sc)
{
    using (MemoryStream stream = new MemoryStream())
    {
        StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
        string content = someLogic.SomeSearchmethod(sc);
        writer.Write(content);
        writer.Flush();
        stream.Position = 0;

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" };
        return result;
    }              
}

通过在按钮点击上简单更改window.location,角度前端调用该方法。

正确执行整个操作方法,没有例外。错误仅由Web浏览器显示。

按照here所述在Chrome中刷新套接字无法解决问题。

1 个答案:

答案 0 :(得分:6)

我在API控制器中尝试过此方法并通过Chrome浏览器调用,它会抛出net::ERR_CONNECTION_RESET

在回复中有一些问题已填充StreamContent,在结果内容中使用ByteArrayContent,效果非常好。

    [HttpGet]
    [Route("csv")]
    public HttpResponseMessage SomeMethod([FromUri]SomeSearchCriteria sc)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
            string content = "test";
            writer.Write(content);
            writer.Flush();
            stream.Position = 0;

            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            //result.Content = new StreamContent(stream);
            result.Content = new ByteArrayContent(stream.ToArray());
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" };
            return result;
        }
    }