我有一个使用NancyFX制作的API服务,以及一些前端开发人员针对此API创建SPA JS客户端。是否可以使用NancyFX启用CORS?
我们想测试对发布的服务器的客户端代码,而无需太多的频率发布的客户端代码。
但是,客户端运行在本地主机,服务器是Windows Azure的。
是否有可能和方便,使NancyFX服务器上CORS?我怎样才能做到这一点?
谢谢。
我有一个使用NancyFX制作的API服务,以及一些前端开发人员针对此API创建SPA JS客户端。是否可以使用NancyFX启用CORS?
我们想测试对发布的服务器的客户端代码,而无需太多的频率发布的客户端代码。
但是,客户端运行在本地主机,服务器是Windows Azure的。
是否有可能和方便,使NancyFX服务器上CORS?我怎样才能做到这一点?
谢谢。
它可能做到这一点在南希
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托管南希,在这种情况下,在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()
。
有没有什么办法来保证这一点?我的意思是确保只有特定的客户才能访问给定的终点? – 2017-01-27 12:06:15
@NorbertNorbertson在使用API时,确定接受请求并验证它,只有当使用者有效时才返回头文件。 – Phill 2017-01-27 12:12:54
我有一个HTML表单发布到Nancy端点。它可以工作,但是可以只允许特定的域发布到此端点? – 2017-01-28 22:39:42
的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 )。
这为我工作得到,但不是为了发布,:( – 2014-08-19 23:43:15
这真的很奇怪。在这一行WithHeader(“访问控制允许方法”,“POST,GET”),你允许你需要的方法。 – oaamados 2014-08-21 01:13:06