Intermittent Server在HTTP头部已发送后无法设置状态。

5 浏览
0 Comments

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(),但我不明白为什么,如果省略此行会出现类似的错误。

为什么会发生这种情况,是否有更好的方法来处理?

0
0 Comments

问题的原因是在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上的问题和答案)

0