API调用下载文件时间歇性触发'Server cannot set content type after HTTP headers have been sent'错误
问题描述
文件已成功下载并在UI中显示图片,但日志里一直弹出这个异常:
Exception Message: Server cannot set content type after HTTP headers have been sent.
Stack Trace: at System.Web.HttpResponse.set_ContentType(String value)
试了网上能找到的所有修复方法都没用,而且单页面会多次调用这个API。相关代码如下:
// send file to client byte[] bytes = result.Image; // image bytes Response.ClearHeaders(); Response.Clear(); Response.ClearContent(); Response.BufferOutput = true; Response.Buffer = true; Response.AppendHeader("Content-Length", bytes.Length.ToString()); Response.ContentType = "APPLICATION/OCTET-STREAM"; Response.BinaryWrite(bytes); Response.Flush(); Response.End(); return Json(new { success = true, Message = "Image Successfully Render" }, "APPLICATION/OCTET-STREAM", JsonRequestBehavior.AllowGet);
问题根源
核心问题就是代码里在Response.End()之后还想返回JSON结果。Response.End()会直接终止当前请求的响应流程,把已经生成的内容发给客户端,然后结束整个请求处理。但后面的return Json(...)会再次尝试修改响应头(设置JSON对应的Content-Type),这时候HTTP头已经被Response.End()发出去了,自然就触发了那个“无法在HTTP头已发送后设置内容类型”的异常。
而且单页面多次调用API,等于每次调用都会触发一次这个无效操作,所以日志里会反复出现该异常。
修复方案
直接删掉return Json(...)那一行就行,理由很简单:
- 你已经通过
Response.BinaryWrite(bytes)把图片内容发给客户端了,Response.End()也已经结束了响应流程,后面的JSON完全是多余的。 - 如果要确认请求成功,图片能正常加载本身就是最直接的反馈;真要加状态标识的话,可以在响应头里加自定义字段,但当前场景下图片显示正常,额外返回JSON纯属多此一举。
修改后的代码:
// send file to client byte[] bytes = result.Image; // image bytes Response.ClearHeaders(); Response.Clear(); Response.ClearContent(); Response.BufferOutput = true; Response.Buffer = true; Response.AppendHeader("Content-Length", bytes.Length.ToString()); Response.ContentType = "APPLICATION/OCTET-STREAM"; Response.BinaryWrite(bytes); Response.Flush(); Response.End();
内容的提问来源于stack exchange,提问作者Mr. Unkown
相关产品推荐
相关产品推荐

