2013-11-14 74 views
1

我有一个NancyFx.OWIN应用程序。我试图利用Katana的诊断“ErrorPage”(来自http://www.nuget.org/packages/Microsoft.Owin.Diagnostics/2.0.0)来显示从我的NancyModules返回的错误响应。Nancy.Owin错误传递到Owin AppBuilder管道?

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

虽然我可以显示来自IAppBuilder上下文此页的错误,不幸的是我无法从南希得到错误响应显示它。

我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!"); 
    }; 

我希望进行格式化,并提出阿拉错误“UseErrorPage()”功能,因为我下面南希异常管道,其格式都异常转换成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管道中?

+0

本博客文章帮助我理解这个问题... http://byterot.blogspot.com/2013/08/OWIN-Katana-challenges-blues-library-developer-aspnetwebapi-nancyfx.html – TheFastCat

回答

0

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

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

是的,我刚刚重新尝试过;不起作用 – TheFastCat

0

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

1

您需要传递南希本身内的错误。只需在某处添加此代码即可使用。

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