Подтвердить что ты не робот

Можно ли включить CORS с помощью NancyFX?

У меня есть служба API, созданная с помощью NancyFX, и несколько сторонних разработчиков, создающих SPA JS-клиент против этого API.

Мы хотели бы протестировать код на стороне клиента на опубликованном сервере, не публикуя код клиента со слишком большой частотой.

Но клиент работает на локальном хосте, а сервер находится в Windows Azure.

Возможно ли и легко включить CORS на сервере NancyFX? Как я могу это сделать?

Спасибо.

4b9b3361

Ответ 1

Его можно сделать в бутстрафере Нэнси

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

        });

Ответ 2

Если вы используете 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() в свой маршрут.

Ответ 3

Если ваш HTTP-запрос simple, то Ответ на фил будет достаточно, но если запрос не так прост, браузер отправит предварительную проверку. Проверка предполета - это запрос 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, вызовите этот метод расширения в bootstrapper:

protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
{
    base.ApplicationStartup(container, pipelines);

    pipelines.EnableCORS();
}

Обратите внимание, что он не расширяет NancyModule, потому что OPTIONS обрабатывается вне модуля (также здесь).