2013-04-22 12 views

risposta

12

La risposta da nemesv è corretto, ma volevo solo aggiungere un esempio utilizzando la ViewRenderer al posto del 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

Questo è il modo migliore in quanto consente di visualizzare motori e layout. +1 – sed

+5

Si potrebbe migliorare ulteriormente un po 'usando l'estensione 'WithStatusCode' per rendere' Handle' un one-liner: 'context.Response = viewRenderer.RenderView (context," /status/404").WithStatusCode(statusCode); ' – Crisfole

10

È sufficiente fornire un'implementazione dell'interfaccia IStatusCodeHandler (verrà prelevata automaticamente da Nancy).

Nel metodo HandlesStatusCode viene restituito true per HttpStatusCode.NotFound.

E nel metodo Handle è necessario impostare la proprietà Response su NancyContext con una risposta contenente il contenuto della pagina di errore. È possibile utilizzare ad esempio il 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;    
    } 
} 
Problemi correlati