2013-04-22 11 views

Odpowiedz

12

Odpowiedź z nemesv jest poprawna, ale chciałem tylko dodać przykład używając ViewRenderer zamiast GenericFileResponse.

public class MyStatusHandler : IStatusCodeHandler 
{ 
    private IViewRenderer viewRenderer; 

    public MyStatusHandler(IViewRenderer viewRenderer) 
    { 
     this.viewRenderer = viewRenderer; 
    } 

    public bool HandlesStatusCode(HttpStatusCode statusCode, 
            NancyContext context) 
    { 
     return statusCode == HttpStatusCode.NotFound; 
    } 

    public void Handle(HttpStatusCode statusCode, NancyContext context) 
    { 
     var response = viewRenderer.RenderView(context, "/status/404"); 
     response.StatusCode = statusCode; 
     context.Response = response; 
    } 
} 
+0

To jest o wiele lepszy sposób, ponieważ pozwoli na przeglądanie silników i układów. +1 – sed

+5

Możesz poprawić to trochę bardziej, używając rozszerzenia 'WithStatusCode', aby uczynić' Handle' jedną linią: 'context.Response = viewRenderer.RenderView (context," /status/404").WithStatusCode(statusCode); ' – Crisfole

10

Wystarczy podać implementację interfejsu IStatusCodeHandler (zostanie on automatycznie odebrany przez Nancy).

W metodzie HandlesStatusCode zwraca true dla HttpStatusCode.NotFound.

I w metodzie Handle należy ustawić właściwość Response na NancyContext z odpowiedzią zawierającą treść strony błędu. Można użyć na przykład GenericFileResponse:

public class My404Hander : IStatusCodeHandler 
{ 
    public bool HandlesStatusCode(HttpStatusCode statusCode, 
            NancyContext context) 
    { 
     return statusCode == HttpStatusCode.NotFound; 
    } 

    public void Handle(HttpStatusCode statusCode, NancyContext context) 
    { 
     var response = new GenericFileResponse("404.html", "text/html"); 
     response.StatusCode = statusCode; 
     context.Response = response;    
    } 
} 
Powiązane problemy