Я работаю над проектом API ASP.NET Core 1.0 (выпуска).
Я написал собственный фильтр исключений для регистрации и возврата стандартной ошибки вызывающим абонентам. В IIS-Express все работает так, как ожидалось. Я получаю код ответа 500 и пользовательский объект json. Однако при развертывании на полный сервер IIS я не получаю ответа. Ошибка регистрируется, но ответ никогда не отправляется клиенту. Это для меня загадка.Написание пользовательского тела ответа 500 работает с IIS Express, но сбой в IIS ASP.Net Core 1.0
Вот исключение фильтра:
public async Task OnExceptionAsync(ExceptionContext context)
{
Exception ex = context.Exception;
string message = string.Empty;
int incidentId = 0;
string parameters = string.Empty;
if (ex is NotifyingException)
{
parameters = Newtonsoft.Json.JsonConvert.SerializeObject(((NotifyingException)ex).NotificationData);
}
incidentId = await Logger.LogIncidentAsync(context.HttpContext.Request.Path, ex, parameters);
message = string.Format(ValidationResources.OperationFailed, incidentId);
string msg = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = message, incidentId = incidentId });
byte[] bytes = Encoding.UTF8.GetBytes(msg);
context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
}
В startup.cs, я добавляю фильтр (IncidentExceptionFilter), как это:
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.Filters.Add(new ClaimsAuthorizationFilter());
config.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
config.Filters.Add(typeof(IncidentExceptionFilter));
}
);
У меня есть простой тест-страницы, просто кидает исключение для теста. Это то, что я получаю от использования Postman при работе на IIS:
Отлично. Именно то, что я ожидаю. Однако при полной IIS Postman говорит: «Граф не получил никакого ответа». Остальная часть API работает нормально, и журнал записывается, поэтому он попадает в фильтр, и ничего не выходит ...
Странно. Кстати, вы могли бы просто сделать это в своем фильтре исключений и не делать это явно. Попробуйте и проверьте, исправляет ли она проблему в IIS var result = new JsonResult (new {message = message, accidentId = инцидентId}); result.StatusCode = 500; context.Result = result; –
Это действительно решило проблему! Благодаря! Тайна остается, но проблема исправлена. – Elton
Можете ли вы попробовать что-то ... до моего предлагаемого изменения, вы можете попробовать явно установить свойство Content-Length и посмотреть, исправляет ли это проблему в IIS –