实现选项HttpVerb

时间:2014-02-27 12:24:07

标签: c# .net nancy

我想接受角网站的选项请求。每个端点(注册,登录等)都需要接受选项http动词。

然后我将以下内容添加到响应标头中。

   After += ctx =>
                    {
                        ctx.Response.WithHeader("Access-Control-Allow-Origin", "*");
                        ctx.Response.WithHeader("Access-Control-Allow-Headers", "accept, client-token, content-type");
                        ctx.Response.WithHeader("Access-Control-Allow-Methods", "POST, GET");
                        ctx.Response.WithHeader("Access-Control-Max-Age", "30758400");
     };

我不想做的是为每个端点添加额外的路由,例如

    Post[path + "Login"] = x => Login();
    Options[path + "Login"] = x => Login();

这将是大量的样板代码。

有没有办法可以使用通配符路由拦截任何选项请求,以便我的所有端点都可以接受选项请求?

2 个答案:

答案 0 :(得分:3)

Nancy有OPTIONS个请求的隐式路由,即尚未定义用户定义的OPTIONS路由。请参阅OptionsRoute以供参考。

如果您想要OPTIONS次请求的自定义行为,您可以选择添加AfterRequest挂钩:

protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
    pipelines.AfterRequest += ctx =>
    {
        // This will always be called at the end of the request
        if (ctx.Request.Method.Equals("OPTIONS", StringComparison.Ordinal))
        {
            ctx.Response.WithHeader("Access-Control-Allow-Origin", "*");
            ctx.Response.WithHeader("Access-Control-Allow-Headers", "accept, client-token, content-type");
            ctx.Response.WithHeader("Access-Control-Allow-Methods", "POST, GET");
            ctx.Response.WithHeader("Access-Control-Max-Age", "30758400");
        }
    }
}

但我不确定为什么你只会在OPTIONS个回复中添加CORS标头?

答案 1 :(得分:0)

所以,如果您需要所有标题,您可以在nancy bootstraper中添加ApplicationStartup方法,如下所示。默认的nancy行为将类似于任何选项请求的通配符路由,并将这些标头添加到响应中。

protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {


            pipelines.AfterRequest += ctx =>
            {
                ctx.Response.WithHeader("Access-Control-Allow-Origin", "*");
                ctx.Response.WithHeader("Access-Control-Allow-Headers", "accept, client-token, content-type");
                ctx.Response.WithHeader("Access-Control-Allow-Methods", "POST, GET");
                ctx.Response.WithHeader("Access-Control-Max-Age", "30758400");
            };
        }