我有一些旧的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;
}
}