我有一些旧的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中刷新套接字无法解决问题。
答案 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;
}
}