1

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

(这里是武士刀错误页面的屏幕截图:http: //miso-soup3.hateblo.jp/entry/2013/10/30/205653

虽然我可以将 IAppBuilder 上下文中的错误显示到此页面,但不幸的是,我无法从 Nancy 那里获得错误响应。

我的 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 处理(显示“绿色怪物”视图)

但是,当返回 InternalServerError 状态代码时,OWIN IAppBuilder 管道会忽略它们。因此,当我到达以下南希路线时:

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

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

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() 没有捡起它......当我删除传递时,“错误!” 在浏览器中显示为文本。任何想法如何将 NancyFx 的错误响应连接到 Owin.IAppBuilder 管道中?

4

3 回答 3

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;
            }
        }
    }
}
于 2014-03-09T20:25:52.887 回答
0

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

public void Configuration(IAppBuilder app)
    {
        app.UseWelcomePage("/hello");
        app.UseErrorPage();
        NancyOptions nancyOptions = new NancyOptions();
        app.UseNancy(options => 
            options.PassThroughWhenStatusCodesAre(HttpStatusCode.InternalServerError)); 
    }
于 2013-11-14T19:48:24.880 回答
0

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

于 2013-11-15T14:09:09.823 回答