2014-02-27 29 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"); 
      }; 
     }