我有一个NancyFx.OWIN应用程序。我正在尝试利用Katana的诊断"错误页面"(来自 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.诊断蓝色笑脸欢迎页面2. 我的 NancyModules 中定义的路由按预期运行3. HttpStatusCodes != InternalServerError 由 Nancy 处理(显示"绿色怪物"视图)
但是,当返回 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() 没有拾取它......当我删除直通时,"错误!"在浏览器中显示为文本。任何想法如何将NancyFx的错误响应连接到Owin.IAppBuilder管道中?
您需要传递 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;
}
}
}
}
你能尝试在UseNancy()之前连接UseErrorPage()中间件并尝试相同的场景吗?例如:
public void Configuration(IAppBuilder app)
{
app.UseWelcomePage("/hello");
app.UseErrorPage();
NancyOptions nancyOptions = new NancyOptions();
app.UseNancy(options =>
options.PassThroughWhenStatusCodesAre(HttpStatusCode.InternalServerError));
}
根据 Nancy 文档,当请求通过 Nancy 传递时,响应将被放弃(即使 Nancy 从路由"返回"它)。因此,OWIN 管道中没有错误(即以 NancyResponse 的形式)来显示武士刀错误显示页面。如果我可以将 Nancy 配置为"冒泡"或抛出另一个 OWIN 中间件可以处理的异常,那就太好了。