发送HTTP标头后,间歇服务器无法设置状态

时间:2019-02-28 14:47:30

标签: asp.net-web-api

我在事件日志“发送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是必需的,我不明白为什么,如果错过这一行,也会发生类似的错误。

为什么会发生这种情况,还有更好的方法吗?

1 个答案:

答案 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 objectAdd a custom response header in ApiController(有关SO的问题和答案)