是否可以使用NancyFX启用CORS?

时间:2013-03-27 12:19:11

标签: azure cors nancy

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

我们希望针对已发布的服务器测试客户端代码,而不必频繁发布客户端代码。

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

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

感谢。

3 个答案:

答案 0 :(得分:32)

可以在Nancy的引导程序中执行此操作

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 :(得分:27)

如果您使用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()

答案 2 :(得分:14)

如果您的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();
}

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