Nancy.Owin错误Passthrough到Owin AppBuilder管道?

时间:2013-11-14 19:31:56

标签: c# owin nancy katana

我有一个NancyFx.OWIN应用程序。我正在尝试利用Katana的诊断“ErrorPage”(来自http://www.nuget.org/packages/Microsoft.Owin.Diagnostics/2.0.0)来显示我的NancyModules返回的错误响应。

(katana错误页面的屏幕截图:http://miso-soup3.hateblo.jp/entry/2013/10/30/205653

虽然我可以将IAppBuilder上下文中的错误显示到此页面,但遗憾的是我无法从Nancy显示错误响应。

My Owin创业公司看起来像这样:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseWelcomePage("/hello");
        NancyOptions nancyOptions = new NancyOptions();
        app.UseNancy(options => 
            options.PassThroughWhenStatusCodesAre(HttpStatusCode.InternalServerError))
            .UseErrorPage();  
    }
}

这个功能如下: 1.“/ hello”显示Microsoft.Owin.Diagnostics蓝色笑脸欢迎页面 2.我的NancyModules中定义的路由按预期运行 3. HttpStatusCodes!= InternalServerError由Nancy处理(显示'green monster'视图)

但是,当返回InternalServerError状态代码时,OWIN IAppBuilder管道会忽略它们。所以当我点击下面的南希路线时:

Get["/error"] = _ =>
    {
        throw new Exception("error!");
    };

我希望错误被格式化并呈现'UseErrorPage()'功能,因为我的Nancy异常管道将所有异常格式化为InternalServerError的响应:

public class ErrorPipeline : IApplicationStartup
{
    public void Initialize(IPipelines pipelines)
    {
        pipelines.OnError += (context, exception) =>
        {

            if (exception is Exception)
                return new Response
                {
                    StatusCode = HttpStatusCode.InternalServerError,
                    ContentType = "text/html",
                    Contents = (stream) =>
                    {
                        var errorMessage =
                            Encoding.UTF8.GetBytes(
                                exception.Message);
                        stream.Write(errorMessage, 0,
                                     errorMessage.Length);
                    }
                };

            return HttpStatusCode.InternalServerError;
        };
    }
}

但是根本没有显示任何内容。我知道管道错误响应是作为响应发回的,Nancy正在通过它,但不知何故UseErrorPage()没有把它拿起来...当我删除passthrough时,“错误!”在浏览器中显示为文本。 如何将NancyFx的错误响应挂钩到Owin.IAppBuilder管道?

3 个答案:

答案 0 :(得分:1)

您需要在Nancy内部传递错误。只需在某处添加此代码即可。

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

    public void Handle(HttpStatusCode statusCode, NancyContext context)
    {
        object errorObject;
        if (context.Items.TryGetValue(NancyEngine.ERROR_EXCEPTION, out errorObject))
        {
            var exception = errorObject as Exception;

            if (exception != null)
            {
                throw exception;
            }
        }
    }
}

答案 1 :(得分:0)

您可以尝试在UseNancy()之前连接UseErrorPage()中间件并尝试相同的方案吗?例如:

public void Configuration(IAppBuilder app)
    {
        app.UseWelcomePage("/hello");
        app.UseErrorPage();
        NancyOptions nancyOptions = new NancyOptions();
        app.UseNancy(options => 
            options.PassThroughWhenStatusCodesAre(HttpStatusCode.InternalServerError)); 
    }

答案 2 :(得分:0)

根据Nancy文档,当请求通过Nancy响应时被放弃(即使nancy“从路由返回”它)。因此,在OWIN管道内(即以NancyResponse的形式)没有错误显示要显示的武士刀错误显示页面。如果我可以将Nancy配置为“冒泡”或抛出另一个OWIN中间件可以处理的异常,那就太好了。