web-dev-qa-db-fra.com

Points de terminaison CORS sur les points de terminaison asp.net Webforms [WebMethod]

J'essaie d'ajouter des fonctions de point de terminaison annotées [WebMethod] à une application Web de style Webforms (.aspx et .asmx). 

J'aimerais annoter ces points de terminaison avec [EnableCors] et ainsi bénéficier de toutes les fonctionnalités utiles d'ajax-preflight.

VS2013 accepte l'annotation, mais les terminaux ne jouent toujours pas avec Nice avec CORS. (Ils fonctionnent bien lorsqu'ils sont utilisés de même origine mais pas d'origine croisée).

Je ne peux même pas les amener à fonctionner de manière croisée avec le bas et sale

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");

approche - mes navigateurs rejettent les réponses et les en-têtes de réponse d'origine croisée n'apparaissent pas.

Comment obtenir la fonctionnalité CORS dans ces points de terminaison [WebMethod]?

12
O. Jones

Je vous recommande de vérifier que toutes les étapes de cette page ont été vérifiées: CORS sur ASP.NET

En plus de:

Response.AppendHeader("Access-Control-Allow-Origin", "*");

Essayez aussi:

Response.AppendHeader("Access-Control-Allow-Methods","*");

Essayez d’ajouter directement dans la configuration Web:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Methods" value="*" />
       <add name="Access-Control-Allow-Headers" value="Content-Type" />
     </customHeaders>
   </httpProtocol>
</system.webServer>

À défaut, vous devez vous assurer de contrôler les deux domaines.

9
MikeDub

Si vous avez besoin de la demande de contrôle en amont, par exemple pour pouvoir envoyer des requêtes authentifiées, vous ne pouvez pas définir Access-Control-Allow-Origin: *. Il doit s'agir d'un domaine Origin spécifique.
Vous devez également définir les en-têtes de réponse Access-Control-Allow-Methods et Access-Control-Allow-Headers, si vous utilisez autre chose que les valeurs par défaut.
(Notez que ces contraintes sont simplement la façon dont CORS fonctionne - c’est sa définition.)

Donc, il ne suffit pas d'ajouter l'attribut [EnableCors], vous devez définir des valeurs pour les paramètres: 

[EnableCors(origins: "https://www.olliejones.com", headers: "X-Custom-Header", methods: "PUT", SupportsCredentials = true)]

Ou si vous voulez faire les choses manuellement et explicitement: 

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "https://www.olliejones.com");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Headers", "X-Custom-Header");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Methods", "PUT");
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true");

Une dernière chose - vous devez appeler .EnableCors() à l’initiation. Dans par exemple MVC ou WebAPI, vous appelez cela sur HttpConfiguration, lors de l’enregistrement de la configuration, etc. - mais je n’ai aucune idée de la façon dont cela fonctionne avec WebForms. 

2
AviD

Si vous utilisez la méthode AppendHeader pour envoyer des en-têtes spécifiques au cache et que vous utilisez simultanément le modèle d'objet cache (Cache) pour définir la stratégie de cache, les en-têtes de réponse HTTP relatifs à la mise en cache peuvent être supprimés lors de l'utilisation du modèle d'objet cache. Ce comportement permet à ASP.NET de conserver les paramètres les plus restrictifs. Par exemple, considérons une page comprenant des contrôles utilisateur. Si ces contrôles ont des stratégies de cache en conflit, la stratégie de cache la plus restrictive sera utilisée. Si un contrôle utilisateur définit l'en-tête "Cache-Control: Public" et qu'un autre contrôle définit l'en-tête plus restrictif "Cache-Control: Private" via des appels à SetCacheability, l'en-tête "Cache-Control: Private" sera envoyé avec le réponse.

Vous pouvez créer un protocole httpProtocol dans Web Config pour customHeaders.

<httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Methods" values="*" />        
     </customHeaders>
   <httpProtocol>
0
Nirav Patel

Pour le formulaire Web, vous pouvez utiliser 

Response.AddHeader ("Access-Control-Allow-Origin", "*");

au lieu de 

Response.AppendHeader ("Access-Control-Allow-Origin", "*");

Le premier fonctionne pour l'ancienne version de ASP.Net Web Form.

0
Joe Park

Vous pouvez faire comme ça dans MVC

[EnableCors(origins: "*", headers: "*", methods: "*")]
public ActionResult test()
{
     Response.AppendHeader("Access-Control-Allow-Origin", "*");
     return View();
}
0
Ankur Shah