首页 文章

是否可以使用NancyFX启用CORS?

提问于
浏览
27

我有一个使用NancyFX创建的API服务,以及一些前端开发人员针对此API创建SPA JS客户端 .

我们希望针对已发布的服务器测试客户端代码,而无需以过多的频率发布客户端代码 .

但是,客户端在localhost运行,服务器在Windows Azure .

在NancyFX服务器上启用CORS是否可行且容易?我怎样才能做到这一点?

谢谢 .

3 回答

  • 13

    它可以在Nancy的bootstraper中做到这一点

    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");
    
            });
    
  • 32

    如果您使用IIS来托管Nancy,在本例中是在Windows Azure上,那么您只需更新web.config即可为每个请求添加标头 .

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

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

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

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

    然后你可以在你的路线中拨打 this.EnableCors() .

  • 27

    如果您的HTTP请求是simple,则Phill's answer就足够了,但如果请求不那么简单,浏览器将发送预检检查 . 预检检查是OPTIONS 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) .

相关问题