You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:15:26