我在事件日志“发送HTTP标头后服务器无法设置状态”中遇到间歇性错误。 webapi网站运行正常,即使发生这种情况也可以提供正确的输出。
异常信息: 异常类型:HttpException 异常消息:发送HTTP标头后,服务器无法设置状态。在System.Web.HttpResponse.set_StatusCode(Int32 值)在System.Web.HttpResponseWrapper.set_StatusCode(Int32 价值) System.Web.Http.WebHost.HttpControllerHandler.d__25.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.WebHost.HttpControllerHandler.d__15.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.WebHost.HttpControllerHandler.d__12.MoveNext() ---从上一个引发异常的位置开始的堆栈跟踪- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar)在 System.Web.HttpTaskAsyncHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果) System.Web.HttpApplication.CallHandlerExecutionStep.InvokeEndHandler(IAsyncResult 一只老鼠 System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)
按如下方式直接操作响应对象(直到运行时才知道json的格式)。
var response= HttpContext.Current.Response;
response.StatusCode = (int) HttpStatusCode.OK;
response.Headers.Add("X-Robots-Tag", "noindex, nofollow");
response.Write("Some json");
response.Flush();
response.End();
response.End是必需的,我不明白为什么,如果错过这一行,也会发生类似的错误。
为什么会发生这种情况,还有更好的方法吗?
答案 0 :(得分:1)
由于您用asp.net-web-api
标记了问题,因此我假设您正在api控制器方法中使用该代码。如果是这样,我建议像这样返回未知的Json:
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("Some json", System.Text.Encoding.UTF8, "application/json")
};
response.Headers.Add("X-Robots-Tag", "noindex, nofollow");
return response;
以上代码摘自以下链接,并进行了改编: Put content in HttpResponseMessage object 和 Add a custom response header in ApiController(有关SO的问题和答案)