J'ai essayé tout ce qui est écrit dans cet article: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api , mais rien ne fonctionne. J'essaie d'obtenir des données de webAPI2 (MVC5) à utiliser dans un autre domaine en utilisant angularJS.
mon contrôleur ressemble à ceci:
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
c#
asp.net-mvc
angularjs
asp.net-web-api
cors
Noa Gani
la source
la source
Réponses:
Vous devez activer CORS dans votre API Web . La manière la plus simple et la plus préférée d'activer CORS globalement consiste à ajouter ce qui suit dans web.config
Veuillez noter que les méthodes sont toutes spécifiées individuellement, au lieu d'être utilisées
*
. C'est parce qu'un bogue se produit lors de l'utilisation*
.Vous pouvez également activer CORS par code.
Mise à jour
ci - dessous NuGet package est requis:
Microsoft.AspNet.WebApi.Cors
.Ensuite, vous pouvez utiliser l'
[EnableCors]
attribut sur des actions ou des contrôleurs comme celui-ciOu vous pouvez l'enregistrer globalement
Vous devez également gérer les
Options
demandes de contrôle en amont avec lesHTTP OPTIONS
demandes.Web API
doit répondre à laOptions
demande afin de confirmer qu'il est bien configuré pour prendre en chargeCORS
.Pour gérer cela, tout ce que vous avez à faire est de renvoyer une réponse vide . Vous pouvez le faire dans vos actions, ou vous pouvez le faire globalement comme ceci:
Cette vérification supplémentaire a été ajoutée pour s'assurer que les anciens
APIs
qui ont été conçus pour accepter uniquementGET
et lesPOST
demandes ne seront pas exploités. Imaginez envoyer uneDELETE
requête à unAPI
design alors que ce verbe n'existait pas. Le résultat est imprévisible et les résultats peuvent être dangereux .la source
La réponse de @ Mihai-Andrei Dinculescu est correcte, mais pour le bénéfice des chercheurs, il y a aussi un point subtil qui peut provoquer cette erreur.
L'ajout d'un '/' à la fin de votre URL empêchera EnableCors de fonctionner dans tous les cas (par exemple depuis la page d'accueil).
Ie cela ne fonctionnera pas
mais cela fonctionnera:
L'effet est le même si vous utilisez l'attribut EnableCors.
la source
J'ai suivi toutes les étapes ci-dessus indiquées par Mihai-Andrei Dinculescu .
Mais dans mon cas, j'avais besoin d' une étape de plus car http OPTIONS a été désactivé dans Web.Config par la ligne ci-dessous.
<remove name="OPTIONSVerbHandler" />
Je viens de le supprimer de Web.Config (il suffit de le commenter comme ci-dessous) et Cors fonctionne comme un charme
la source
Cela peut être dû à l'installation des packages Cors Nuget.
Si vous rencontrez le problème après avoir installé et activé des cors de nuget, vous pouvez essayer de réinstaller l'API Web.
Depuis le gestionnaire de packages, exécutez
Update-Package Microsoft.AspNet.WebApi -reinstall
la source
Essayez ceci pour vous assurer que vous avez correctement configuré CORS:
Ne fonctionne toujours pas? Vérifiez la présence des en-têtes HTTP.
la source
config.EnableCors()
est également nécessaire pour cela.Pour que n'importe quel protocole CORS fonctionne, vous devez avoir une méthode OPTIONS sur chaque point de terminaison (ou un filtre global avec cette méthode) qui renverra ces en-têtes:
La raison en est que le navigateur enverra d'abord une requête OPTIONS pour `` tester '' votre serveur et voir les autorisations
la source
J'attrape le cas suivant sur les cors. Peut-être que ce sera utile à quelqu'un. Si vous ajoutez la fonctionnalité 'WebDav Redirector' à votre serveur, les requêtes PUT et DELETE échouent.
Vous devrez donc supprimer 'WebDAVModule' de votre serveur IIS:
Ou ajoutez à votre configuration:
la source
Je sais que j'arrive très tard. Cependant, pour tous ceux qui recherchent, j'ai pensé publier ce qui a finalement fonctionné pour moi. Je ne prétends pas que c'est la meilleure solution - seulement que cela a fonctionné.
Notre service WebApi utilise la méthode config.EnableCors (corsAttribute). Cependant, même avec cela, il échouerait toujours sur les demandes avant le vol. La réponse de @ Mihai-Andrei Dinculescu m'a fourni l'indice. Tout d'abord, j'ai ajouté son code Application_BeginRequest () pour vider les demandes d'options. Cela n'a TOUJOURS pas fonctionné pour moi. Le problème est que WebAPI n'ajoutait toujours aucun des en-têtes attendus à la requête OPTIONS. Le rinçage seul n'a pas fonctionné - mais cela m'a donné une idée. J'ai ajouté les en-têtes personnalisés qui seraient autrement ajoutés via le web.config à la réponse pour la requête OPTIONS. Voici mon code:
Évidemment, cela ne s'applique qu'aux requêtes OPTIONS. Tous les autres verbes sont gérés par la configuration CORS. S'il y a une meilleure approche à cela, je suis toute oreille. Cela me semble une triche et je préférerais que les en-têtes soient ajoutés automatiquement, mais c'est ce qui a finalement fonctionné et m'a permis de passer à autre chose.
la source
La réponse de @ Mihai-Andrei Dinculescu a fonctionné pour moi, par exemple:
<httpProtocol>
dans la<system.webServer>
section de web.configOPTIONS
demandes via le mentionnéApplication_BeginRequest()
dansglobal.asax
Sauf que son chèque
Request.Headers.AllKeys.Contains("Origin")
n'a PAS fonctionné pour moi, car la requête contenait unoriging
, donc en minuscules. Je pense que mon navigateur (Chrome) l'envoie comme ça pour les requêtes CORS.J'ai résolu cela de manière un peu plus générique en utilisant à la place une variante insensible à la casse de sa
Contains
vérification:if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {
la source
Si vous avez des nœuds security \ requestFiltering dans votre web.config comme suit:
assurez-vous de l'ajouter également
la source
J'avais essayé tout ce que je pouvais trouver sur le net y compris les méthodes qui ont été données sur cette réponse. Après avoir presque essayé de résoudre le problème pendant une journée entière, j'ai trouvé la solution qui a fonctionné pour moi comme un charme.
dans le fichier WebApiConfig du dossier App_Start , commentez toutes les lignes de code et ajoutez le code suivant:
la source
Je sais que les gens trouveront probablement cela très évident au début, mais réfléchissez vraiment à cela. Cela peut souvent arriver si vous avez fait quelque chose de mal.
Par exemple, j'ai eu ce problème parce que je n'ai pas ajouté d'entrée d'hôte à mon fichier d'hôtes. Le vrai problème était la résolution DNS. Ou je viens de me tromper sur l'URL de base.
Parfois, j'obtiens cette erreur si le jeton d'identité provient d'un serveur, mais j'essaie de l'utiliser sur un autre.
Parfois, vous obtiendrez cette erreur si vous avez une mauvaise ressource.
Vous pourriez l'obtenir si vous placez le middleware CORS trop tard dans la chaîne.
la source
Évitez les emplacements multiples en activant CORS, comme WebApiCOnfig.cs, la méthode GrantResourceOwnerCredentials dans le fournisseur et l'attribut d'en-tête de contrôleur, etc. Voici la liste qui provoque également l'origine du contrôle d'accès
Le code ci-dessous est plus que suffisant pour fixer l'origine du contrôle d'accès. // Assurez-vous que app.UseCors doit être en haut de la ligne de code de la configuration.
Cela a ralenti mon problème.
la source
Ce problème se produit lorsque vous essayez d'accéder à partir d'un domaine différent ou d'un port différent.
Si vous utilisez Visual Studio, accédez à Outils> Gestionnaire de package NuGet> Console du gestionnaire de package. Là, vous devez installer le package NuGet Microsoft.AspNet.WebApi.Cors
Ensuite, dans PROJET> App_Start> WebApiConfig, activez CORS
Une fois installé avec succès, créez la solution et cela devrait suffire
la source