Intermittent Server在HTTP头部已发送后无法设置状态。
Intermittent Server在HTTP头部已发送后无法设置状态。
在事件日志中出现间歇性错误"服务器无法在发送HTTP头后设置状态"。即使发生此错误,webapi站点仍能正常工作并传递正确的输出。
异常信息:
异常类型:HttpException
异常信息:服务器无法在发送HTTP头后设置状态。 在 System.Web.HttpResponse.set_StatusCode(Int32 value) 处
在 System.Web.HttpResponseWrapper.set_StatusCode(Int32 value) 处
在 System.Web.Http.WebHost.HttpControllerHandler.d__25.MoveNext() 处
--- End of stack trace from previous location where exception was thrown --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 处
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 处
在 System.Web.Http.WebHost.HttpControllerHandler.d__15.MoveNext() 处
--- End of stack trace from previous location where exception was thrown --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 处
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 处
在 System.Web.Http.WebHost.HttpControllerHandler.d__12.MoveNext() 处
--- End of stack trace from previous location where exception was thrown --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 处
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 处
在 System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar) 处
在 System.Web.HttpTaskAsyncHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 处
在 System.Web.HttpApplication.CallHandlerExecutionStep.InvokeEndHandler(IAsyncResult ar) 处
在 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(),但我不明白为什么,如果省略此行会出现类似的错误。
为什么会发生这种情况,是否有更好的方法来处理?
问题的原因是在HTTP头部发送后服务器无法设置状态。解决方法是在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;
以上代码参考了以下链接并进行了适应:
1. [Put content in HttpResponseMessage object](https://stackoverflow.com/a/41076308/634872)
2. [Add a custom response header in ApiController](https://stackoverflow.com/a/41895917/634872)(Stack Overflow上的问题和答案)