2014-02-27 24 views
2

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

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

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(); 

这将是样板代码群众。

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

回答

3

南希对于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"); 
     } 
    } 
} 

但我真的不知道为什么你只会增加CORS标头OPTIONS反应?

+0

所以它使我在你的链接编辑OptionsRoute类添加我需要的头。我需要在某个地方实例化这个类吗?这个课程在哪里挂? – Jules

+0

这不是一个钩子。这是Nancy对“OPTIONS”动词的默认处理。我不确定我明白你想要完成什么?你想添加标题给所有的回应? – khellang

+0

似乎你可以让南希的默认选项实现运行,然后在你的后挂钩添加标头,如果请求的方法是选项。 –

0

所以如果你需要所有的标题,我可以像下面那样在nancy bootstraper中添加ApplicationStartupmethod。默认的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"); 
      }; 
     }