我有一个使用NancyFX创建的API服务,以及一些前端开发人员针对此API创建SPA JS客户端 .
我们希望针对已发布的服务器测试客户端代码,而无需以过多的频率发布客户端代码 .
但是,客户端在localhost运行,服务器在Windows Azure .
在NancyFX服务器上启用CORS是否可行且容易?我怎样才能做到这一点?
谢谢 .
它可以在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"); });
如果您使用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() .
this.EnableCors()
如果您的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) .
3 回答
它可以在Nancy的bootstraper中做到这一点
如果您使用IIS来托管Nancy,在本例中是在Windows Azure上,那么您只需更新web.config即可为每个请求添加标头 .
这可以通过添加以下内容来完成:
或者你可以做Sunny所建议的,如果你不喜欢每次都可以添加自己的扩展方法那么写:
然后你可以在你的路线中拨打
this.EnableCors()
.如果您的HTTP请求是simple,则Phill's answer就足够了,但如果请求不那么简单,浏览器将发送预检检查 . 预检检查是OPTIONS HTTP请求,也必须处理 .
以下是配置CORS的扩展方法:
要启用CORS,请在引导程序中调用此扩展方法:
请注意,它不会扩展NancyModule,因为OPTIONS is handled outside of module(也是here) .