27

NancyFXで作成されたAPIサービスと、このAPIに対してSPAJSクライアントを作成するフロントエンド開発者がいます。

あまり頻繁にクライアントコードを公開することなく、公開されたサーバーに対してクライアント側のコードをテストしたいと思います。

ただし、クライアントはローカルホストで実行され、サーバーはWindowsAzureにあります。

NancyFXサーバーでCORSを有効にすることは可能で簡単ですか?どうやってやるの?

ありがとう。

4

3 に答える 3

31

ナンシーのブートストラッパーでこれを行うことは可能です

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");

        });
于 2014-05-08T23:32:03.410 に答える
27

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()その後、あなたはあなたのルートを呼び出すことができます。

于 2013-04-25T05:13:54.317 に答える
16

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を拡張していないことに注意してください。

于 2015-03-28T20:33:23.640 に答える