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

问题描述 投票:0回答:1

我们的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。无论如何,客户端将看不到结果或结果代码,因为它已经消失了。

其他possibly related question

我们正在使用最新版本的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();
    }
}

PUT http://localhost:56952/api/foo/bar

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

UPDATE 2

来自Application Insights的遥测

“应用程序洞察遥测日志”

我们的ASP.NET Web API 2应用程序被移动应用程序使用。使用Azure Application Insights,我们检测到许多响应代码为500(内部服务器错误)的响应,而没有任何异常...

asp.net iis asp.net-web-api2
1个回答
0
投票

我认为这是.Net Framework中的错误。我写了一种解决方法,当满足指定条件时结束当前执行的请求:

© www.soinside.com 2019 - 2024. All rights reserved.