2013-03-27 75 views
24

我有一个使用NancyFX制作的API服务,以及一些前端开发人员针对此API创建SPA JS客户端。是否可以使用NancyFX启用CORS?

我们想测试对发布的服务器的客户端代码,而无需太多的频率发布的客户端代码。

但是,客户端运行在本地主机,服务器是Windows Azure的。

是否有可能和方便,使NancyFX服务器上CORS?我怎样才能做到这一点?

谢谢。

回答

31

它可能做到这一点在南希

protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context) 
    { 

     //CORS Enable 
     pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) => 
     { 
      ctx.Response.WithHeader("Access-Control-Allow-Origin", "*") 
          .WithHeader("Access-Control-Allow-Methods", "POST,GET") 
          .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type"); 

     }); 
+1

这为我工作得到,但不是为了发布,:( – 2014-08-19 23:43:15

+1

这真的很奇怪。在这一行WithHeader(“访问控制允许方法”,“POST,GET”),你允许你需要的方法。 – oaamados 2014-08-21 01:13:06

27

如果您正在使用IIS托管南希,在这种情况下,在Windows Azure上,那么你可以直接更新web.config中的头添加到每个请求。

这可以通过添加以下来完成:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

或者你可以做什么阳光建议,如果你不喜欢写,每次你可以添加自己的扩展方法:

public static class NancyExtensions 
{ 
    public static void EnableCors(this NancyModule module) 
    { 
     module.After.AddItemToEndOfPipeline(x => 
     { 
      x.Response.WithHeader("Access-Control-Allow-Origin", "*"); 
     }); 
    } 
} 

然后,你可以调用你的路线this.EnableCors()

+0

有没有什么办法来保证这一点?我的意思是确保只有特定的客户才能访问给定的终点? – 2017-01-27 12:06:15

+0

@NorbertNorbertson在使用API​​时,确定接受请求并验证它,只有当使用者有效时才返回头文件。 – Phill 2017-01-27 12:12:54

+0

我有一个HTML表单发布到Nancy端点。它可以工作,但是可以只允许特定的域发布到此端点? – 2017-01-28 22:39:42

11

的bootstraper如果您的HTTP请求simple然后Phill's answer就足够了,但如果要求不是那么简单,浏览器会发送一个飞行前检查。预检检查是一个选项HTTP请求,这也必须处理。

这里是配置CORS的扩展方法:

public static class MyNancyExtension 
{ 
    public static void EnableCORS(this Nancy.Bootstrapper.IPipelines pipelines) 
    { 
     pipelines.AfterRequest.AddItemToEndOfPipeline(ctx => 
     { 
      if (ctx.Request.Headers.Keys.Contains("Origin")) 
      { 
       var origins = "" + string.Join(" ", ctx.Request.Headers["Origin"]); 
       ctx.Response.Headers["Access-Control-Allow-Origin"] = origins; 

       if (ctx.Request.Method == "OPTIONS") 
       { 
        // handle CORS preflight request 

        ctx.Response.Headers["Access-Control-Allow-Methods"] = 
         "GET, POST, PUT, DELETE, OPTIONS"; 

        if (ctx.Request.Headers.Keys.Contains("Access-Control-Request-Headers")) 
        { 
         var allowedHeaders = "" + string.Join(
          ", ", ctx.Request.Headers["Access-Control-Request-Headers"]); 
         ctx.Response.Headers["Access-Control-Allow-Headers"] = allowedHeaders; 
        } 
       } 
      } 
     }); 
    } 
} 

要启用CORS在引导程序调用该扩展方法:

protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines) 
{ 
    base.ApplicationStartup(container, pipelines); 

    pipelines.EnableCORS(); 
} 

,请注意是不延长NancyModule因为OPTIONS is handled outside of module(也here )。