NancyFXで作成されたAPIサービスと、このAPIに対してSPAJSクライアントを作成するフロントエンド開発者がいます。
あまり頻繁にクライアントコードを公開することなく、公開されたサーバーに対してクライアント側のコードをテストしたいと思います。
ただし、クライアントはローカルホストで実行され、サーバーはWindowsAzureにあります。
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>
または、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()
その後、あなたはあなたのルートを呼び出すことができます。
HTTPリクエストが単純な場合は、 Phillの回答で十分ですが、リクエストがそれほど単純でない場合は、ブラウザがプリフライトチェックを送信します。プリフライトチェックはOPTIONSHTTPリクエストであり、これも処理する必要があります。
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はモジュールの外部で処理されるため(ここでも)、 NancyModuleを拡張していないことに注意してください。