2016-06-17 37 views
0

Ich habe eine Website mit Nancy, die mit OWIN gehostet wird.Unmöglich, benutzerdefinierte Fehler Seite mit Nancy auf OWIN zu zeigen

In meiner Startup.cs Datei definiere ich die PassThroughOptions wie folgt:

public void Configuration(IAppBuilder app) 
{ 
    app.UseNancy(o => { 
     o.PassThroughWhenStatusCodesAre(
      HttpStatusCode.NotFound, 
      HttpStatusCode.InternalServerError 
      ); 
     o.Bootstrapper = new Bootstrapper(); 
    }); 

    app.UseStageMarker(PipelineStage.MapHandler); 
} 

Ich brauche die NotFound Anfragen an Pass-Through, so dass Dinge wie meine gebündelt .Weniger Dateien oder Miniprofiler-Ergebnisse oder statische Dateien in der Wurzel meiner Website (robots.txt oder sitemap.xml) arbeiten.

Ich habe auch einen benutzerdefinierten StatusCodeHandler für den 404-Code, der auch einen benutzerdefinierten Header überprüft, um zwischen statischen Dateien (oder .less Bundles/Miniprofiler) und tatsächlichen Sachen zu unterscheiden, die nicht in den Methoden meiner Module gefunden werden.

public void Handle(HttpStatusCode statusCode, NancyContext context) 
{ 
    Log.Warn("Not found: " + context.Request.Url); 
    base.Handle(statusCode, context, "Errors/NotFound"); 
} 

Dieser Handler sollte dann tatsächlich die Fehlerseite anzeigen.

protected void Handle(HttpStatusCode statusCode, NancyContext context, string view) 
{ 
    var response = new Negotiator(context) 
     .WithModel(GetErrorModel(context)) 
     .WithStatusCode(statusCode) 
     .WithView(view); 

    context.Response = responseNegotiator.NegotiateResponse(response, context); 
} 

Aber die Fehlerseite wird nie angezeigt. Die Anfrage wird dreimal bearbeitet und schließlich wird die Standard-IIS-Fehlerseite angezeigt (mit errorMode = "Custom" für httpErrors) oder einfach eine weiße Seite (mit existingResponse = "PassThrough" für httpErrors).

Gibt es eine Möglichkeit, so etwas wie eine benutzerdefinierte Fehlerseite anzuzeigen, wenn Sie eine Nancy-Website auf OWIN hosten?

Antwort

0

Was Sie dort haben, sieht gut aus, es sieht so aus, als ob Sie die Hosting Nancy with Owin Dokumente verwenden.

Hier ist, was für mich funktioniert:

Die Startup.cs (erforderlich für Owin): (Wir haben beide unterschiedlich die Konfigurationsfunktion codiert, sind Sie nur die Erweiterung Helfer verwendet, während ich bin nicht gleich. . Ergebnis Dies ist in meinem App.Web Projekt)

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseNancy(options => 
     { 
      options.Bootstrapper = new BootStrapper(); 
      options.PerformPassThrough = context => context.Response.StatusCode == HttpStatusCode.NotFound; 
     }); 

     app.UseStageMarker(PipelineStage.MapHandler); 
    } 
} 

404 Handler. (Stand der Dokumentation, keine Rolle spielt, wo diese in dem Projekt ist, durch IStatusCodeHandler Umsetzung automatisch durch abgeholt werden Nancy Dies ist in meinem App.WebApi-Projekt mit anderen Modulklassen.)

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

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

     context.Response = response; 
    } 
} 

Die 'statuspages' Ordner in meinem App.Web Projekt:

Visual Studio folder structure

prüft diese SO für einen Vergleich Post der Verwendung GenericFileReponse oder Viewrenderer (How to display my 404 page in Nancy?).