Можно ли включить CORS с помощью NancyFX?
У меня есть служба API, созданная с помощью NancyFX, и несколько сторонних разработчиков, создающих SPA JS-клиент против этого API.
Мы хотели бы протестировать код на стороне клиента на опубликованном сервере, не публикуя код клиента со слишком большой частотой.
Но клиент работает на локальном хосте, а сервер находится в Windows Azure.
Возможно ли и легко включить CORS на сервере NancyFX? Как я могу это сделать?
Спасибо.
Ответы
Ответ 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 обрабатывается вне модуля (также здесь).