Ajax Appel de Service Web - Pas de "Access-Control-Allow-Origin' en-tête est présent
Heyya,
Je sais que cette question a été posée et j'ai lu chaque et chaque réponse de chaque question ici, mais encore ne peut pas sembler obtenir mon projet fonctionne correctement. Mon scénario est un peu différent des autres questions cependant, vous ne savez pas si cela fait une différence, mais ici nous allons.
J'ai un projet de web services. Services seul fonctionne très bien, il n'y a pas de problème avec ça. Et il y a de ça un autre projet qui s'occupe de l'INTERFACE utilisateur de la part de choses et d'appeler ces services par le biais de jquery ajax. Il a été fonctionne bien parce que je n'ai pas testé ce cas sur Google Chrome avant. Tout fonctionne parfaitement sur Internet Explorer.
Maintenant; mon service web application s'exécute sur le port 40000 (localhost:40000) et l'INTERFACE utilisateur projet s'exécute sur un autre port aléatoire mais toujours dans le localhost. Comme je l'ai dit, mes appels ajax etc fonctionne parfaitement sur Internet explorer, mais quand il s'agit de Google Chrome, il échoue. La console affiche le message d'erreur suivant:
XMLHttpRequest cannot load http://127.0.0.1:40000/abc.asmx/TheMethodName. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:17256' is therefore not allowed access. The response had HTTP status code 400.
Par le façon, il était comme "localhost:40000" avant de sorte que certains post sur l'internet a suggéré que je devrais la changer en une adresse IP à la place de localhost.
De toute façon, j'ai édité mon web.fichier de config sur mon projet de service web et a ajouté ce qui suit (qui n'a aucun sens)
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="crossDomain" crossDomainScriptAccessEnabled="true">
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:17256" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Max-Age" value="1728000" />
</customHeaders>
</httpProtocol>
</system.webServer>
BTW, si j'utilise la première ligne: il échoue complètement et dit l'en-tête de réponse des messages ne correspondent pas et je ne peux même pas démarrer le service invoquer.
Et oui, j'ai aussi édité mon appel ajax, a ajouté le paramètre suivant:
crossDomain: true,
Maintenant, ce qui me manque ici? J'ai été sur cela pendant des jours maintenant et je suis sur le point de perdre mon esprit 🙂 Elle est un peu trop tard pour changer la structure de l'ensemble du projet (service de style de l'INTERFACE utilisateur, je veux dire), puisque les charges de code ont été écrites pour les services de l'INTERFACE et de projets. S'il vous plaît aider, je suis désespérée! 🙂
Acclamations
Edit:
Il s'avère donc j'ai besoin d'utiliser JSONP, pas de JSON - car il n'est pas coincé avec le Contrôle d'Accès de chose, ce qui est bien. Je peux convertir mes appels ajax en JSONP. Mais j'ai besoin d'une autre aide 🙂
J'ai écrit un mondial ajax méthode qui est appelée à partir de chaque opération séparées sur les pages et il fonctionne comme un charme (sur Internet Explorer à nouveau, bien sûr). Maintenant que dois-je faire pour convertir cette fonction wrapper dans un jsonp truc?
function RemoteCall(WebService, RemoteMethod, RemoteParameters, callbackResult) {
if (RemoteParameters == null || RemoteParameters == "") {
RemoteParameters = "{ }";
}
var remoteCall = $.ajax({
type: "POST",
url: ProvideService(WebService, RemoteMethod),
data: RemoteParameters,
contentType: ajaxContentType,
dataType: ajaxDataType,
async: true,
crossDomain: true,
success: function (msg) {
msg.header("Access-Control-Allow-Origin", "*");
callbackResult(msg.d);
},
error: function (xhr, ajaxOptions, thrownError) {
callbackResult(xhr.status + '\r\n' + thrownError + '\r\n' + xhr.responseText);
}
});
}
J'ai vu quelques posts que je devrais ajouter une propriété comme jsonp: 'jsonp_callback" avec la méthode de rappel (c'est là où je suis confus). Quoi à ce sujet?
Une autre chose; j'ai envoyé mon json paramètres en tant que texte dans une variable comme
var jSONParams = '{ UserID: "1", EmailAddress: "[email protected]" }';
Dois-je continuer à envoyer ce que le même format ou doit-elle être convertie à une sorte d'objet JSON ou quelque chose?
BTW: mes ajax fonction est complètement séparée fichier JS - ne sais pas si cela fait une différence si...
Acclamations
Le point de terminaison à l'aide de n'importe quel type d'authentification? L'authentification Windows, etc?
OriginalL'auteur | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
Je préfère vous suffit d'activer la SCRO que de changer tout votre appel AJAX.
Essayez-vous modifié le web.config pour le webservice pour ajouter la ligne suivante ?
Vérifier aussi cette question car si la SCRO /JSONP est mieux pour vous
Donc, JSONP ou de la SCRO?
OriginalL'auteur kwangsa
La clé de la résolution de la SCRO erreurs est de payer l'attention sur les en-têtes de la réponse du serveur(s). Vous devez télécharger le trafic http moniteur comme Fiddler pour examiner ces en-têtes. Ensuite, vous pouvez l'utiliser en conjonction avec le navigateur de la console d'erreurs de comprendre exactement ce qui ne va pas.
Voici ce qu'un typique/succès de 200 OK de la SCRO réponse ressemble (prises directement à partir de Fiddler):
Dans le cas où vous êtes l'obtention de la
No 'Access-Control-Allow-Origin' header is present on the requested resource
, la tête est manquante à partir de la réponse, soit d'être livré d'une manière qui viole le Chrome de la mise en œuvre de la spec W3C.En regardant votre site web.fichier de config, je suis prêt à parier son ce dernier. Par exemple, la validité de Contrôle d'Accès Permettent à en-tête d'Origine avec de multiples entrées:
alors que la façon dont votre site web.config en-têtes de section est configuré livrera plusieurs entrées, ce qui n'est généralement pas valide
... surtout dans les scénarios où l'authentification et l'Access-Control-Allow-Pouvoirs en-têtes qui sont passés à sécurisé points de terminaison:
OriginalL'auteur Daniel Szabo
Bienvenue à la pas tellement cool terres de la SCRO problème dans le browserland, j'ai les recommandations suivantes:
J'Espère que cela aide
Ce qui concerne,
Arif Imran
Ah et PS: je ne peut pas accueillir ces projets dans le même port qui ne fera pas l'utiliser parce que le projet de service sera comme un fournisseur de projet de l'INTERFACE utilisateur de nombreux autres projets et je n'ai pas vraiment envie de les exécuter ensemble de l'INTERFACE utilisateur projets sur le même port ne sais pas si c'est encore possible, car les répertoires virtuels sont créés dans IIS pour chaque port et le doute si IIS permettra que... je pense que je vais prendre mes chances avec JSONP chose - si j'y arrive 🙂
Jetez un oeil à cette json-jsonp-tutorial.craic.com/index.html, JSONP n'est pas quelque chose qui serait très difficile pour vous de mettre en œuvre. Pouvez-vous être plus précis sur le sujet du problème que vous rencontrez.
OriginalL'auteur Arif Imran
Merci à vous tous pour vos réponses;
J'ai trouvé la solution à mon problème. Me semble que je n'ai pas été en accordant une attention complète de la message d'erreur correctement 🙂
Après j'ai ajouté le Access-Control-Allow-Origin en-tête de mon site web.fichier de config, il s'avère que j'ai commencé à avoir une autre erreur, qui a été content-type en-tête personnalisé manquait et j'ai pensé que j'étais encore en train de la SCRO erreur.
Donc, l'ajout de la
<add name="Access-Control-Allow-Origin" value="*" />
définition dans mon web.config effectivement résolu mon cross-origin problème en premier lieu! Et j'ai aussi testé afin de permettre à certains domaines ou à des demandes en provenance des ports avec le site web suivant.config entrée d'en-tête et il a également travaillé comme un charme, puisque je pense que c'est la meilleure option pour les utiliser depuis que j'ai ne sera pas publier mes services par le secteur public.Bravo à tous, le problème est résolu 🙂
OriginalL'auteur
ajouter le code ci-dessous dans le web.fichier de configuration.
OriginalL'auteur PK-1825