ASP.NET Web API Внутренняя ошибка сервера при отключении клиента - PullRequest
0 голосов
/ 16 октября 2019

Наше приложение ASP.NET Web API 2 используется мобильными приложениями. Используя Azure Application Insights, мы обнаружили много ответов с кодом ответа 500 (Внутренняя ошибка сервера) без каких-либо исключений, связанных с ними в Application Insights. Во время сеанса отладки мы не столкнулись с какими-либо исключениями.

У нас было подозрение, что это может быть вызвано отключениями клиента. После реализации приложения .net, имитирующего разъединения, мы могли бы повторить эту проблему даже в чистом проекте webapi2.

После дальнейшего изучения мы выяснили, что код результата 500 (после отключения клиента) возникает только при определенныхусловия соблюдены. Запрос должен быть отменен для http-операции без GET и до достижения события ExecuteRequestHandler asp.net. По запросам GET мы не можем повторить эту проблему, равно как и по запросам, которые ввели или прошли событие ExecuteRequestHandler.

Наша цель - отфильтровать отсоединения клиентов от журналов и сосредоточиться на реальных проблемах.

Эта проблема может быть связана с ASP.NET Web API OperationCanceledException, когда браузер отменяет запрос , однако принятое решение не работает, поскольку отключение происходит до того, как будет достигнут какой-либо DelegatingHandler. Мы не будем использовать упомянутое решение, потому что клиент отключается не проблема сервера, а клиент. Например, в netcore отмененные запросы имеют код ответа 0 в журналах. В любом случае, клиент не увидит ни результат, ни код результата, потому что он уже пропал.

Другой возможно связанный вопрос .

Мы используем последнюю версию Microsoft. AspNet.WebApi v5.2.7 и расследование проводится только на компьютере разработчика с IISExpress.

ОБНОВЛЕНИЕ

Включает минимальный код для воспроизведения в чистом проекте 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

В среднем 1из 5 отмененных запросов заканчиваются на 500 при отмене через 10 мс. Код ответа доступен из журналов сервера Application Insights или окна вывода в VS при регистрации. Клиент не получит код ответа, поскольку соединение будет закрыто до того, как будет возвращен любой код ответа.

ОБНОВЛЕНИЕ 2

Телеметрия из Application Insights

Application Insights Telemetry log

...