Impossible d’append Access-Control-Allow-Origin à mon projet de bibliothèque WCF

J’essaie de comprendre pourquoi cet ajax appelé ne fonctionne pas

$.ajax({ type: 'GET', url: "http://localhost:8732/Design_Time_Addresses/InMotionGIT_NT.Address.Service/AddressService/json/capitalize", data: { streetAddress : JSON.ssortingngify(streetAddress) , consumer : JSON.ssortingngify(consumer)} , datatype: "jsonp", success: function (data) { $('body').append('
'+data.IDblah+' '+ data.prueba+'
'); alert(data.IDblah); }

Le service reçoit les données est correctement reçu et la réponse est correcte. Pourquoi est-ce que je me trompe?

J’ai essayé d’append cette propriété à l’ajax appelé mais sans succès. crossDomain : true

 [OperationContract()] [WebInvoke(Method="GET", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)] public ssortingng Capitalize(StreetAddress streetAddress,ConsumerInformation consumer) 

L’erreur que je reçois c’est la commune

  XMLHttpRequest cannot load Origin http://localhost:50816 is not allowed by Access-Control-Allow-Origin. 

METTRE À JOUR

J’ai essayé d’append l’en-tête à la réponse en ajoutant la configuration dans mon fichier App.config mais sans succès

        

Ce lien aiderait: http://enable-cors.org/

Vous devez append les en-têtes suivants dans votre réponse qui est renvoyée au client:

// Autoriser tous les domaines

Access-Control-Allow-Origin: *

OU

// Autoriser des domaines spécifiques

Access-Control-Allow-Origin: http://example.com:8080 http://foo.example.com

Mettez ceci dans le côté service de votre fichier de configuration

        

Ça marche pour moi! Merci!

J’avais le même problème lorsque je travaillais avec mon service WCF directement dans Visual Studio, dans Chrome et Firefox. Je l’ai corrigé avec ce qui suit:

Editez le fichier Global.asax avec la fonction ci-dessous:

 private void EnableCrossDomainAjaxCall() { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept"); HttpContext.Current.Response.End(); } } 

Puis appelez la fonction de

 protected void Application_BeginRequest(object sender, EventArgs e) { EnableCrossDomainAjaxCall(); } 

Vous pouvez obtenir plus d’informations à partir de l’URL suivante:

http://blog.blums.eu/2013/09/05/restfull-wcf-service-with-cors-and-jquery-and-basic-access-authentication .

la solution est de créer un fichier Global.asax

  protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } 

Une autre façon de gérer cela, qui est préférable pour les services auto-hébergés, peut être trouvée ici .

Pour le service WCF, vous devez développer un nouveau comportement et l’inclure dans la configuration du système d’extrémité:

  1. Créer un inspecteur de message

      public class CustomHeaderMessageInspector : IDispatchMessageInspector { Dictionary requiredHeaders; public CustomHeaderMessageInspector (Dictionary headers) { requiredHeaders = headers ?? new Dictionary(); } public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) { return null; } public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) { var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty; foreach (var item in requiredHeaders) { httpHeader.Headers.Add(item.Key, item.Value); } } } 
  2. Créer un comportement de sharepoint terminaison et utiliser Message Inspector pour append des en-têtes

      public class EnableCrossOriginResourceSharingBehavior : BehaviorExtensionElement, IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { var requiredHeaders = new Dictionary(); requiredHeaders.Add("Access-Control-Allow-Origin", "*"); requiredHeaders.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS"); requiredHeaders.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type"); endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders)); } public void Validate(ServiceEndpoint endpoint) { } public override Type BehaviorType { get { return typeof(EnableCrossOriginResourceSharingBehavior); } } protected override object CreateBehavior() { return new EnableCrossOriginResourceSharingBehavior(); } } 
  3. Enregistrer un nouveau comportement dans web.config

          
  4. Ajouter un nouveau comportement à la configuration du comportement du terminal

           
  5. Configurer le point final