web-dev-qa-db-fra.com

servicestack REST API et CORS

Tout le monde sait si le framework servicestack peut être utilisé pour créer des services CORS REST?

Je frappe ma haine contre le WCF REST trucs depuis des jours maintenant - totalement inutile.

Merci

46
user156888

Utilisation du plugin CorsFeature

Activation de la prise en charge de Global CORS

Nous avons maintenant un CorsFeature qui encapsule les en-têtes CORS dans le Plugin ci-dessous pour faciliter l'ajout du support CORS à votre ServiceStack prestations de service.

Généralement, c'est maintenant tout ce qui est nécessaire:

Plugins.Add(new CorsFeature());

Qui utilise les valeurs par défaut:

CorsFeature(allowedOrigins:"*", 
    allowedMethods:"GET, POST, PUT, DELETE, OPTIONS", 
    allowedHeaders:"Content-Type", 
    allowCredentials:false);

Vous pouvez laisser de côté toutes les valeurs correspondant à la valeur par défaut. Par exemple. si vous vouliez simplement restreindre les méthodes autorisées à seulement GET et POST requêtes, vous pouvez simplement faire:

Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));

Activer globalement CORS pour toutes les demandes OPTION

Une fois la CorsFeature (ou les en-têtes globaux manuels) enregistrée, vous pouvez éventuellement choisir d'activer CORS pour tous [~ # ~] option [~ # ~] demande en ajoutant un filtre PreRequest pour émettre tous les en-têtes globaux enregistrés (c'est-à-dire les en-têtes dans CorsFeature) et court-circuiter tous [~ # ~] options [~ # ~] demandes avec:

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;'
});

Activation de la prise en charge par service CORS

Au lieu d'utiliser le plugin ci-dessus, ServiceStack vous permet également d'activer CORS par service en utilisant [EnableCors] attribut Filter Response qui a les mêmes valeurs par défaut que ci-dessus. Par exemple. Vous pouvez activer uniquement GET, POST comme ci-dessus avec:

[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }

Activation manuelle de CORS

La beauté de ServiceStack est qu'il est construit sur un noyau très flexible et simple. Nous n'essayons pas de créer des API de type fort sur tout, car il est impossible de prédire quels nouveaux en-têtes HTTP/codes d'état existeront à l'avenir. Ainsi, bien que nous fournissions un comportement pratique pour accomplir les tâches courantes, nous fournissons également une API flexible qui vous permet de configurer la sortie HTTP souhaitée.

Définition d'en-têtes HTTP globaux

Voici comment activer globalement le partage d'origine croisée dans votre configuration 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" },
        },
    });
}

Retour d'en-têtes HTTP personnalisés dans un service

Ces en-têtes seront envoyés à chaque demande, vous pouvez également l'activer pour des services Web spécifiques, c'est-à-dire prendre le Hello World Web Service par exemple:

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" }, }
        };
    }
}

Ce qui précède est tout le code C # dont vous avez besoin pour développer un service Web qui est ensuite automatiquement câblé pour vous sur tous les verbes HTTP (GET, POST, etc.) et les points de terminaison intégrés, à savoir JSON, XML, JSV, HTML, CSV, SOAP 1.1/1.2 - gratuitement, sans aucune configuration ou friction requise. Caisse l'exemple en direct du service Web ci-dessus .

En plus des points de terminaison ci-dessus, chaque service peut être appelé par JSONP (une autre façon populaire d'activer les appels de service interdomaines dans les applications Ajax) où chaque service peut être appelé via JSONP en ajoutant simplement le ? callback = cb paramètre à la chaîne de requête, par exemple:

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

Ceci est un autre exemple des gains de flexibilité et de productivité de l'utilisation de ServiceStack où vous bénéficiez littéralement d'une flexibilité sans friction et d'une liberté expressive dans votre service Web renvoyez littéralement à peu près n'importe quoi et il est sérialisé comme prévu.

Il est non seulement plus facile à utiliser que WCF (avec plus de fonctionnalités prêtes à l'emploi) mais il est également beaucoup plus rapide où tous ses composants sont hautement optimisés pour des performances maximales .

87
mythz

Juste pour info, car j'ai eu du mal à comprendre où vivait le plugin CORS. Peut-être que je suis juste épaisse.

C'est dedans ServiceStack.ServiceInterface.Cors.

7
Tyson Phalp