在异步路由处理程序中执行每路径身份验证时出现NancyFX错误

时间:2015-02-06 11:08:10

标签: c# authentication asynchronous nancy

当我尝试异步处理路由并在该路由中进行身份验证时,Nancy抛出RouteExecutionEarlyExitException,然后返回状态代码500(内部服务器错误)而不是401(未授权)。

我的路由处理程序看起来大致如下:

Get["route/to/private/stuff", true] = async (args, ct) =>
{
    this.RequiresAuthentication()
    // process request
}

我遵循指南here来配置无状态身份验证。

当我的路由处理程序如下所示时,它按预期工作(在内部抛出异常,但返回401):

Get["route/to/private/stuff"] = args =>
{
    this.RequiresAuthentication()
    // process request
}

如何让Nancy在使用per-route身份验证的异步路由处理程序中返回401? 我正在使用Nancy 1.0.0。

1 个答案:

答案 0 :(得分:1)

好的,现在我明白了。不幸的是我提供的信息太少了。 我对如何处理请求并不十分诚实。当RouteExecutionEarlyExitException同步抛出时,Nancy以500而不是401失败,如下所示:

Get["/", true] = (args, ct) =>
{
    this.RequiresAuthentication();
    return Task.FromResult((object) "Hello World!");
};

当Nancy在调用路由处理程序时使用await时不会发生AFAIK(即await handler(args, ct)),但是当同步调用处理程序时(即handler(args, ct).ContinueWith(...))可能会发生这种情况。 和it seems一样,南希使用后一种方法。

因此解决方案是坚持使用async修饰符或确保仅异步抛出异常(例如在Task.Run内)。