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]
?
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.
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.
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>
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.
Vous pouvez faire comme ça dans MVC
[EnableCors(origins: "*", headers: "*", methods: "*")]
public ActionResult test()
{
Response.AppendHeader("Access-Control-Allow-Origin", "*");
return View();
}