客户端断开连接时ASP.NET Web API内部服务器错误

客户端断开连接时ASP.NET Web API内部服务器错误,asp.net,iis,asp.net-web-api2,Asp.net,Iis,Asp.net Web Api2,我们的ASP.NET Web API 2应用程序被移动应用程序使用。使用Azure Application Insights,我们检测到许多响应代码为500(内部服务器错误)的响应,在Application Insights中没有任何异常。在调试会话期间,我们没有遇到任何抛出的异常 我们怀疑这可能是由客户端断开连接引起的。在实现了一个模拟断开连接的.net应用程序之后,我们甚至可以在一个干净的webapi2项目上复制这个问题 经过进一步调查,我们发现,结果代码500(在客户端断开连接后)仅在满足

我们的ASP.NET Web API 2应用程序被移动应用程序使用。使用Azure Application Insights,我们检测到许多响应代码为500(内部服务器错误)的响应,在Application Insights中没有任何异常。在调试会话期间,我们没有遇到任何抛出的异常

我们怀疑这可能是由客户端断开连接引起的。在实现了一个模拟断开连接的.net应用程序之后,我们甚至可以在一个干净的webapi2项目上复制这个问题

经过进一步调查,我们发现,结果代码500(在客户端断开连接后)仅在满足特定条件时出现。在到达
ExecuteRequestHandler
asp.net事件之前,需要在非GET http操作上取消请求。对于GET请求,我们无法复制此问题,对于输入或传递了
ExecuteRequestHandler
事件的请求也不能复制此问题

我们的目标是从日志中过滤掉客户端断开连接,并关注真正的问题

此问题可能与有关,但公认的解决方案不起作用,因为断开连接发生在到达任何DelegatingHandler之前。我们不会使用上述解决方案,因为客户端断开连接不是服务器问题,而是客户端问题。例如,在netcore中,已取消的请求在日志中的响应代码为0。无论如何,客户端将看不到结果或结果代码,因为它已经消失了

其他的

我们使用的是最新版本的Microsoft.AspNet.WebApi v5.2.7,调查仅在使用IISExpress的开发机器上进行

更新

包括在clean webapi2项目上复制的最小代码

Global.asax.cs

公共类WebAPI应用程序:System.Web.HttpApplication
{
受保护的无效应用程序\u Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
受保护的无效应用程序\u EndRequest(对象发送方,事件参数e)
{
var context=HttpContext.Current;
Debug.WriteLine($“{context.Response.StatusCode}:{context.Response.SubStatusCode}:{context.Request.Path}:{context.Request.Url.AbsoluteUri}”);
}
}
HomeController.cs

[RoutePrefix(“api/foo”)]
公共类HomeController:ApiController
{
[路线(“酒吧”)]
[HttpPut]
公共异步任务Put()
{
等待任务。延迟(200);
返回Ok();
}
}

平均而言,5个被取消的请求中有1个在10毫秒后被取消时以500结尾。当记录时,可以从VS中的服务器日志应用程序洞察或输出窗口访问响应代码。客户端将不会收到响应代码,因为在返回任何响应代码之前,连接已关闭

更新2

来自应用程序洞察的遥测


我认为这是.Net Framework中的一个缺陷。我已经编写了一个解决方案,以在满足指定标准时结束当前正在执行的请求:

  • 客户要求取消
  • 客户端未连接
  • 处理只能在
    ExecuteRequestHandler
    事件之前发生
公共类取消HttpModule:IHttpModule
{
public void Init(HttpApplication应用程序)
{
application.OnExecuteRequestStep(OnExecuteRequestStep);
}
私有void OnExecuteRequestStep(HttpContextBase上下文,操作步骤)
{
如果(context.Response.StatusCode!=0
&&context.Response.ClientDisconnectedToken.IsCancellationRequested
&&!context.Response.isClient已连接
&&(int)context.CurrentNotification<(int)RequestNotification.ExecuteRequestHandler)
{
context.Response.StatusCode=0;
context.ApplicationInstance.CompleteRequest();
}
步骤();
}
公共空间处置()
{
}
}

处理完成后,状态代码将更改为零(与.net core中的情况类似),并且在ASP.net管道中更改为
EndRequest
事件。我已经在生产环境中测试了一个月,没有发现导致500个请求的日志中没有相应的异常记录。

您能分享一些示例代码吗?您可以尝试使用一些工具,如debug diagnostic tool来捕获一些转储文件并分析转储文件。@JalpaPanchal该问题可以在defalut webapi项目中重现,我们只引入了登录global.asax EndRequest事件,在home controller返回200中执行操作,并在10毫秒后取消请求的客户端。如果以上任何一项对您有帮助,我可以用代码更新问题或将其发布在github上。如果您发布一个示例项目,这真的非常方便。@JalpaPanchal我已经用clean webapi2项目上的代码修改更新了问题。我无法复制您的问题。你能分享详细的错误信息吗?