2013-08-25 2 views
3

Я выполнил свой собственный обработчик 404 для NancyFX, и он отлично работает, но есть проблема. Проблема в том, что он отменяет даже те запросы, в которых я хочу отправить код 404, но с моим пользовательским сообщением, например. "Пользователь не найден".NancyFX - Пользовательский обработчик 404 переопределяет каждый ответ 404

Handler

public class NotFoundHandler : IStatusCodeHandler 
{ 
    public bool HandlesStatusCode(HttpStatusCode statusCode, NancyContext context) 
    { 
     if (statusCode == HttpStatusCode.NotFound) 
     { 
      // How to check here if the url actually exists? 
      // I don't want every 404 request to be the same 
      // I want to send custom 404 with Response.AsJson(object, HttpStatusCode.NotFound) 
      return true; 
     } 

     return false; 
    } 

    public void Handle(HttpStatusCode statusCode, NancyContext context) 
    { 
     context.Response = new TextResponse(JsonConvert.SerializeObject(new { Message = "Resource not found" }, Formatting.Indented)) 
     { 
      StatusCode = statusCode, 
      ContentType = "application/json" 
     }; 
    } 
} 

Проблема

Get["/"] = _ => 
{ 
    // This will not show "User not found", instead it will be overriden and it will show "Resource not found" 
    return Response.AsJson(new { Message = "User not found" }, HttpStatusCode.NotFound); 
}; 

ответ

2

Вы сами решаете, какие ответы вы хотите обрабатывать в вашем IStatusCodeHandler реализации (ов). Сейчас вы, только, проверяете сам код состояния, не добавляя к нему контекст. Что вы могли бы сделать (например) будет только перезапись context.Response, если она не содержит ответа, который соответствует определенному критерию, например, как типа JsonResponse

if(!(context.Response Is JsonResponse)) 
    { 
      context.Response = new TextResponse(JsonConvert.SerializeObject(new { Message = "Resource not found" }, Formatting.Indented)) 
      { 
       StatusCode = statusCode, 
       ContentType = "application/json" 
      }; 
    } 

Поскольку у вас есть доступ к полному NancyContext, у вас также есть доступ ко всем Request и Response (который был возвращен маршрутом или еще что-то в конвейере запроса). Кроме того, вы можете использовать произвольные метаданные в NancyContext.Items, если вам нужен еще больший контроль.

Надеюсь, что это поможет

Смежные вопросы