无法在OWIN上显示Nancy的自定义错误页面

时间:2016-06-17 11:27:13

标签: owin nancy

我有一个使用Nancy的网站,使用OWIN托管。

在我的Startup.cs文件中,我定义了PassThroughOptions,如下所示:

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

    app.UseStageMarker(PipelineStage.MapHandler);
}

我需要传递NotFound请求,以便我的网站根目录(robots.txt或sitemap.xml)中捆绑的.less文件或miniprofiler-results或静态文件等工作正常工作。

我还有一个自定义的StatusCodeHandler用于404代码,它还检查自定义标头以区分静态文件(或.less bundle / miniprofiler)和我的模块中找不到的实际内容。方法

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

然后,这个处理程序应该显示错误页面。

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);
}

但永远不会显示错误页面。请求被处理三次,最终显示默认的IIS错误页面(使用errorMode ="自定义"用于httpErrors)或仅显示白页(使用existingResponse =" PassThrough"用于httpErrors)

在OWIN上托管南希网站时,有没有办法显示像自定义错误页面这么简单的东西?

1 个答案:

答案 0 :(得分:0)

你在那里看到的很好看,看起来你正在使用Hosting Nancy with Owin文档。

这对我有用:

Startup.cs(Owin需要):(我们都对配置函数进行了不同的编码,你只是使用扩展助手而我不是。结果相同。这是在我的App.Web项目中。 )

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处理程序:(根据文档,无论项目在何处,通过实现IStatusCodeHandler它都会被Nancy自动选中。这是在我的App.WebApi项目中与其他模块类一起使用。)< / p>

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;
    }
}

我的App.Web项目中的'statuspages'文件夹:

Visual Studio folder structure

检查此SO帖子,以便使用GenericFileReponse或ViewRenderer(How to display my 404 page in Nancy?)进行比较。