2016-07-06 1 views
1

Я работаю над проектом 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: enter image description here

Отлично. Именно то, что я ожидаю. Однако при полной IIS Postman говорит: «Граф не получил никакого ответа». Остальная часть API работает нормально, и журнал записывается, поэтому он попадает в фильтр, и ничего не выходит ...

+1

Странно. Кстати, вы могли бы просто сделать это в своем фильтре исключений и не делать это явно. Попробуйте и проверьте, исправляет ли она проблему в IIS var result = new JsonResult (new {message = message, accidentId = инцидентId}); result.StatusCode = 500; context.Result = result; –

+0

Это действительно решило проблему! Благодаря! Тайна остается, но проблема исправлена. – Elton

+0

Можете ли вы попробовать что-то ... до моего предлагаемого изменения, вы можете попробовать явно установить свойство Content-Length и посмотреть, исправляет ли это проблему в IIS –

ответ

1

Как упоминал Киран, я не устанавливал длину содержимого. Это решило проблему. Теперь оба эти решения работают отлично на IIS:

string msg = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = message, incidentId = incidentId }); 
byte[] bytes = Encoding.UTF8.GetBytes(msg); 

context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; 
context.HttpContext.Request.ContentLength = bytes.Length; 
await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length); 

ИЛИ

var result = new JsonResult(new { message = message, incidentId = incidentId }); 
result.StatusCode = StatusCodes.Status500InternalServerError; 
context.Result = result; 

Который намного чище!