API REST API и CORS

Кто-нибудь знает, можно ли использовать инфраструктуру servicestack для создания сервисов REST CORS?

Я уже несколько дней стучаю себя по отношению к WCF REST-материалам - совершенно бесполезно.

Спасибо

Ответ 1

Использование плагина CorsFeature

Включение глобальной поддержки CORS

Теперь мы имеем CorsFeature, который обертывает заголовки CORS в Plugin ниже, чтобы сделать его намного проще для добавления поддержки 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-заголовков

Вот как можно глобально включить Cross Origin Sharing в конфигурацию 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" }, }
        };
    }
}

Вышеупомянутый код С#, необходимый для разработки веб-сервиса, который автоматически подключается для вас на всех HTTP-глаголах (GET, POST и т.д.) и встроенных конечных точках, то есть JSON, XML, JSV, HTML, CSV, SOAP 1.1/1.2 - бесплатно, без каких-либо настроек или трения. Оформить заказ живой пример вышеуказанной веб-службы.

В дополнение к вышеуказанным конечным точкам каждая услуга доступна для вызова JSONP (другой популярный способ включения межсервисных вызовов службы в приложениях Ajax), где каждая служба может быть вызвана через JSONP, просто добавив обратный вызов ? = cb для запроса, например:

http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/world?callback=cb

Это еще один пример гибкости и производительности при использовании ServiceStack, где вы буквально получаете свободу от трения и выразительную свободу в своем веб-сервисе до буквально возвращаете практически что-либо, и он становится сериализованным, как ожидалось.

Это не только легче использовать, чем WCF (с большим количеством функций из коробки), но и намного быстрее, когда все его компоненты высоко оптимизированный для максимальной производительности.

Ответ 2

Просто FYI, так как мне было трудно узнать, где жил плагин CORS. Может быть, я просто толстый.

В ServiceStack.ServiceInterface.Cors.