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

Chrome中的ERR_SPDY_PROTOCOL_ERROR通常与here中所述的Avast安全性相关。但是,就我而言,这不是由Avast引起的,其他Web浏览器也会引发异常。

我的操作方法如下所示:

[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中刷新套接字无法解决该问题。

最佳答案

我已经在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;
        }
    }

07-24 20:05