我们的ASP.NET Web API 2应用程序被移动应用程序使用。使用Azure Application Insights,我们在Application Insights中检测到许多响应代码为500(内部服务器错误)的响应,而没有与它们相关的任何异常。在调试会话期间,我们没有遇到任何引发的异常。
我们怀疑这可能是由于客户端断开连接引起的。在实现模拟断开连接的.net应用程序之后,即使在干净的webapi2项目上,我们也可以复制此问题。
[经过进一步调查,我们发现,结果代码500(在客户端断开连接之后)仅在满足特定条件时出现。需要在非GET http操作上且在ExecuteRequestHandler
asp.net事件到达之前取消该请求。对于GET请求,无论输入或通过ExecuteRequestHandler
事件的请求,我们都无法复制此问题。
我们的目标是筛选出客户端与日志的断开连接,并专注于实际问题。
此问题可能与ASP.NET Web API OperationCanceledException when browser cancels the request有关,但是,已接受的解决方案不起作用,因为在到达任何DelegatingHandler之前就发生了断开连接。我们不会使用上述解决方案,因为客户端断开连接不是服务器问题,而是客户端。例如,在netcore中,已取消的请求在日志中的响应代码为0。无论如何,客户端将看不到结果或结果代码,因为它已经消失了。
我们正在使用最新版本的Microsoft.AspNet.WebApi v5.2.7,并且调查仅在具有IISExpress的开发计算机上进行。
UPDATE
包括要在干净的webapi2项目上复制的最少代码。
Global.asax.cs
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
protected void Application_EndRequest(object sender, EventArgs 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")]
public class HomeController : ApiController
{
[Route("bar")]
[HttpPut]
public async Task<IHttpActionResult> Put()
{
await Task.Delay(200);
return Ok();
}
}
[5个已取消请求中的平均1个在10毫秒后被取消时以500结尾。登录后,可以从VS中的服务器日志 Application Insights或“输出”窗口访问响应代码。客户端将不会收到响应代码,因为在返回任何响应代码之前,连接已关闭。
UPDATE 2
来自Application Insights的遥测
我们的ASP.NET Web API 2应用程序被移动应用程序使用。使用Azure Application Insights,我们检测到许多响应代码为500(内部服务器错误)的响应,而没有任何异常...
我认为这是.Net Framework中的错误。我写了一种解决方法,当满足指定条件时结束当前执行的请求: