web-dev-qa-db-fra.com

Activation de CORS via Web.config vs WebApiConfig et les attributs du contrôleur

Il semble y avoir deux manières fonctionnellement différentes d'activer le partage de demandes entre origines dans l'API Web 2.

L'une consiste à importer System.Web.Http.Cors, décorer un contrôleur avec l'attribut EnableCors et à écrire config.EnableCors() dans WebApiConfig:

[EnableCors(origins: "http://111.111.111.111", headers: "*", methods: "*")]
public class GenericController : ApiController
{
    // etc.

L'autre consiste à modifier le Web.config:

<system.webServer>
     <httpProtocol>
         <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http://111.111.111.111" />
            <add name="Access-Control-Allow-Methods" value="*" />
            <add name="Access-Control-Allow-Headers" value="*" />

Existe-t-il une différence fonctionnelle entre ces deux approches différentes? Laquelle est correcte - ne fait-elle pas la même chose? Si les deux méthodes sont utilisées pour activer CORS, les choses vont-elles exploser?

17
alex

Si vous ajoutez les en-têtes au web.config, la requête chaque qui est servie par cette application inclura les en-têtes spécifiés. Cette méthode est prise en charge au niveau du serveur Web et ne dépend pas de l'exécution de config.EnableCors(). Vous pouvez utiliser cette méthode pour ajouter n'importe quel en-tête HTTP de votre choix.

D'un autre côté, l'attribut EnableCors nécessite WebAPI et vous devez ajouter du code pour le faire fonctionner. Pour l'utilisateur final, le résultat est le même.

Quant à quelle voie est la meilleure? J'ai aimé conserver ces paramètres dans le code de l'application en utilisant l'attribut, ces paramètres sont donc évidents pour les futurs développeurs. Selon vos besoins, vous voudrez peut-être examiner un CorsApiController abstrait que vos principaux ApiControllers pourraient hériter pour fournir les mêmes en-têtes CORS encore et encore. Mais cette méthode ne fonctionnera pas si les en-têtes CORS doivent varier d'un contrôleur à l'autre ou d'une action à l'autre.

11
Steven V