No se pudo agregar Access-Control-Allow-Origin a mi proyecto de biblioteca WCF

Estoy tratando de entender por qué este ajax llamado no funciona

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

El servicio que recibe los datos se recibe correctamente y la respuesta es correcta. ¿Por qué estoy haciendo mal?

Intenté agregar esta propiedad al ajax llamado pero sin éxito crossDomain : true

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

El error que recibo es lo común.

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

ACTUALIZAR

Intenté agregar el encabezado a la respuesta agregando la configuración en mi archivo App.config pero sin éxito

        

Este enlace ayudaría: http://enable-cors.org/

Debe agregar los siguientes encabezados en su respuesta que se envía al cliente:

// Permitir todos los dominios

Access-Control-Allow-Origin: *

O

// Permitir dominios específicos

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

Ponga esto en el lado del servicio de su archivo de configuración

        

¡Esto funciona para mi! ¡Gracias!

Estaba teniendo el mismo problema al trabajar con mi servicio WCF directamente en Visual Studio, en Chrome y Firefox. Lo arreglé con lo siguiente:

Edite el archivo Global.asax con la siguiente función:

 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(); } } 

Entonces llama a la función desde

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

Puede obtener más información de la siguiente url:

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

La solución es crear un archivo 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(); } } 

Otra forma de manejar esto, que es mejor para los servicios auto alojados, se puede encontrar aquí .

Para el servicio WCF, debe desarrollar un nuevo comportamiento e incluirlo en la configuración del punto final:

  1. Crear inspector de mensajes

      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. Cree un comportamiento de punto final y use el inspector de mensajes para agregar encabezados

      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. Registrar nuevo comportamiento en web.config

          
  4. Agregar nuevo comportamiento a la configuración de comportamiento de punto final

           
  5. Configurar punto final