47 votes

ServiceStack API REST et CORS

Est-ce que quelqu'un sait si le framework ServiceStack peut être utilisé pour créer des services REST CORS?

Je me bats contre le bazar REST de WCF depuis des jours maintenant - totalement inutile.

0 votes

J'ai essayé d'utiliser le kit de démarrage WCF REST et dhvik.blogspot.com/2011/06/… (à la fois l'attribut et le tout premier exemple de code peu idéal donné) et je continue à obtenir : Origine xxxxx.com n'est pas autorisée par Access-Control-Allow-Origin.

0 votes

0 votes

Je pense que la console réseau de Chrome signale à tort une demande annulée - Fiddler ne montre pas le même résultat - il dit qu'il s'est bien terminé...

88voto

mythz Points 54874

Utilisation du plugin CorsFeature

Activation du support CORS global

Nous avons désormais un CorsFeature qui encapsule les en-têtes CORS dans le Plugin ci-dessous pour faciliter l'ajout de la prise en charge CORS à vos services ServiceStack.

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

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 omettre toutes les valeurs correspondant à la valeur par défaut. Par exemple, si vous souhaitez uniquement restreindre les méthodes autorisées aux demandes GET et POST, vous pouvez simplement faire :

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

Activer CORS globalement pour toutes les demandes OPTION

Une fois que le CorsFeature (ou les en-têtes globaux manuels) est enregistré, vous pouvez choisir facultativement d'activer CORS pour toutes les demandes OPTION 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 d'interrompre toutes les demandes OPTIONS avec :

this.PreRequestFilters.Add((httpReq, httpRes) => {
    //Traite la requête et ferme les réponses après avoir émis les en-têtes HTTP globaux
    if (httpReq.Method == "OPTIONS") 
        httpRes.EndRequest(); //ajouter un 'using ServiceStack;'
});

Activer le support CORS par service

Au lieu d'utiliser le plugin ci-dessus, ServiceStack vous permet également d'activer le CORS sur une base par service en utilisant l'attribut de filtre de réponse [EnableCors] 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 du CORS

La beauté de ServiceStack est qu'elle est construite sur un noyau extrêmement flexible et simple. Nous n'essayons pas de construire des API fortement typées sur chaque chose, car il est impossible de prédire quelles nouvelles en-têtes HTTP / Codes d'état existeront dans le futur. Donc, tout en fournissant un comportement pratique pour accomplir des tâches courantes, nous fournissons également une API flexible qui vous permet de configurer n'importe quelle sortie HTTP désirée.

Configuration des en-têtes HTTP globaux

Voici comment activer globalement le partage de ressources entre origines dans votre configuration AppHost :

public override void Configure(Container container)
{
    //Autorise les navigateurs modernes (par exemple Firefox) à envoyer n'importe quelle méthode REST HTTP
    base.SetConfig(new EndpointHostConfig
    {
        GlobalResponseHeaders = {
            { "Access-Control-Allow-Origin", "*" },
            { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
            { "Access-Control-Allow-Headers", "Content-Type" },
        },
    });
}

Retourner des en-têtes HTTP personnalisés dans un service

Ces en-têtes seront envoyés à chaque requête, alternativement vous pouvez également l'activer pour des services web spécifiques, c'est-à-dire prendre le Service Web Bonjour le Monde 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" }, }
        };
    }
}

Le code C# ci-dessus est tout ce dont vous avez besoin pour développer un service web qui est ensuite automatiquement connecté pour vous sur tous les verbes HTTP (GET, POST, etc) et les points d'extrémité intégrés, c'est-à-dire JSON, XML, JSV, HTML, CSV, SOAP 1.1/1.2 - gratuitement, sans aucune configuration ou friction requise. Consultez l'exemple en direct du service web ci-dessus.

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

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

Ceci est un autre exemple de la flexibilité et des gains de productivité de l'utilisation de ServiceStack où vous disposez littéralement d'une flexibilité sans friction et d'une liberté expressive dans votre service web pour littéralement retourner à peu près n'importe quoi et qui 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 c'est aussi beaucoup plus rapide où tous ses composants sont hautement optimisés pour des performances maximales.

0 votes

Pouvez-vous expliquer le pipeline pour une demande OPTIONS? Des suppositions sur pourquoi les en-têtes pourraient ne pas être renvoyés, et pourquoi un 404 est renvoyé chaque fois que j'implémente un filtre de demande?

0 votes

Pouvez-vous poser une nouvelle question, expliquer votre problème et fournir l'implémentation de Request Filter et l'effet avant/après qu'il a. Fournissez autant de code pertinent que nécessaire pour reproduire, merci.

2 votes

Peut-être que je fais quelque chose de mal mais [EnableCors(allowedMethods:"GET,POST")] sur le type de service ne semble pas fonctionner. Si je le déplace et le mets sur les méthodes Get() et Options(), alors cela fonctionne.

7voto

Tyson Phalp Points 1033

Tout simplement pour information, j'ai eu du mal à trouver où se trouvait le plugin CORS. Peut-être que je suis juste épais.

C'est dans ServiceStack.ServiceInterface.Cors.

3 votes

C'est pourquoi j'aime resharper :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X