Использование плагина CorsFeature
Включение глобальной поддержки CORS
Теперь у нас есть CorsFeature , который включает заголовки CORS в Плагин ниже, чтобы сделатьгораздо проще добавить поддержку CORS к вашим сервисам ServiceStack.
Обычно это все, что нужно:
Plugins.Add(new CorsFeature());
Использует значения по умолчанию:
CorsFeature(allowedOrigins:"*",
allowedMethods:"GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders:"Content-Type",
allowCredentials:false);
Вы можете опустить любое из значений, соответствующих значению по умолчанию.Например, если вы просто хотите ограничить разрешенные методы только запросами GET и POST, вы можете просто сделать:
Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));
Глобально включить CORS для всех запросов OPTION
После CorsFeature (или вручнуюГлобальные заголовки), вы можете по желанию включить CORS для всех OPTION запросов, добавив фильтр PreRequest для генерации всех зарегистрированных глобальных заголовков (т.е. заголовков в CorsFeature) и замкнув все OPTIONS запросов с:
this.PreRequestFilters.Add((httpReq, httpRes) => {
//Handles Request and closes Responses after emitting global HTTP Headers
if (httpReq.Method == "OPTIONS")
httpRes.EndRequest(); //add a 'using ServiceStack;'
});
Включение поддержки для каждого сервиса CORS
Вместо использования описанного выше плагина ServiceStack также позволяет вам включать CORS для каждого отдельного сервиса, используя [EnableCors] Атрибут фильтра ответов , который имеет те же значения по умолчанию, что и выше.Например, вы можете включить только GET, POST, как указано выше, с помощью:
[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }
Ручное включение CORS
Прелесть ServiceStack в том, что он построен на очень гибком и простомядро.Мы не пытаемся создавать строго типизированные API-интерфейсы для всего, поскольку невозможно предсказать, какие новые HTTP-заголовки / StatusCodes будут существовать в будущем.Поэтому, хотя мы предоставляем удобное поведение для выполнения обычных задач, мы также предоставляем гибкий API, который позволяет вам настраивать любой желаемый вывод HTTP.
Настройка глобальных заголовков HTTP
Это глобальное включение общего доступа к источникам в вашей конфигурации AppHost:
public override void Configure(Container container)
{
//Permit modern browsers (e.g. Firefox) to allow sending of any REST HTTP Method
base.SetConfig(new EndpointHostConfig
{
GlobalResponseHeaders = {
{ "Access-Control-Allow-Origin", "*" },
{ "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
{ "Access-Control-Allow-Headers", "Content-Type" },
},
});
}
Возврат пользовательских заголовков HTTP в службу
Эти заголовки будут отправляться при каждом запросе. В качестве альтернативы вы также можете включить его для определенных веб-служб, например, взять Hello World Web Service , например:
public class Hello {
public string Name { get; set; }
}
public class HelloResponse {
public string Result { get; set; }
}
public class HelloService : IService
{
public object Any(Hello request)
{
var dto = new HelloResponse { Result = "Hello, " + request.Name };
return new HttpResult(dto) {
Headers = {
{ "Access-Control-Allow-Origin", "*" },
{ "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" }
{ "Access-Control-Allow-Headers", "Content-Type" }, }
};
}
}
.весь код C #, необходимый для разработки веб-службы, которая затем автоматически подключается ко всем HTTP-глаголам (GET, POST и т. д.) и встроенным конечным точкам, т. е. JSON, XML, JSV, HTML, CSV, SOAP 1.1 /1.2 - бесплатно, без каких-либо настроек или трений.Оформить заказ живой пример вышеупомянутого веб-сервиса .
В дополнение к вышеуказанным конечным точкам каждый сервис доступен для вызова через JSONP (еще один популярный способ включения вызовов междоменных сервисов в Ajax).приложения), где каждый сервис может быть вызван через JSONP, просто добавив параметр ? callback = cb в строку запроса, например:
http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/world?callback=cb
Это еще один примерИз гибкости и производительности выигрывает использование ServiceStack, когда вы буквально получаете без трения гибкость и выразительную свободу в своем веб-сервисе, чтобы буквально возвращал почти все , и он сериализовался, как и ожидалось.
Это не только проще в использовании, чем WCF (с большим количеством готовых функций), но и намного быстрее, когда все его компоненты высоко оптимизированы для максимальной производительности .