Cómo agregar soporte de dominio cruzado al servicio WCF

Estoy tratando de permitir las solicitudes POST de mi aplicación javascript alojada en localhost: 80 a un servicio RESTful de WCF alojado en un puerto diferente, pero de alguna manera no funciona. He intentado agregar propiedades personalizadas al encabezado, así como agregarlo programáticamente en el método JSONData mi servicio, pero todavía JSONData ‘Método 405 no permitido’ en mi respuesta. ¿Cuál es el enfoque adecuado aquí?

Esta es mi interfaz:

 namespace RestService { public class RestServiceImpl : IRestServiceImpl { #region IRestServiceImpl Members public string JSONData() { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); return "Your POST request"; } #endregion } } 

y el código de servicio:

 using System.ServiceModel; using System.ServiceModel.Web; using System.Web.Script.Services; namespace RestService { [ServiceContract] public interface IRestServiceImpl { [OperationContract] [ScriptMethod] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "export")] string JSONData(); } } 

Y finalmente la configuración:

                                     

Esto funcionó mejor para mí que la versión Web.config:

Crear un Global.asax

Agregue este método al Global.asax.cs :

 using System.Web; namespace StackOverflow { public class Global : System.Web.HttpApplication { protected void Application_BeginRequest(object sender, EventArgs e) { 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, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } } } 

Ref: http://www.dotnet-tricks.com/Tutorial/wcf/X8QN260412-Calling-Cross-Domain-WCF-Service-using-Jquery.html

La habilitación de CORS para solicitudes no GET requiere algo más que configurar el encabezado Access-Control-Allow-Origin ; también tiene que lidiar con las solicitudes de verificación previa , que son solicitudes de OPTIONS que preguntan al servidor si es seguro realizar operaciones que pueden cambiar los datos. (por ejemplo, POST, PUT, DELETE) antes de que se envíe la solicitud real.

He escrito una entrada de blog sobre la adición de soporte CORS para WCF. No es la implementación más simple, pero esperamos que el código en la publicación se pueda copiar / pegar en su proyecto. La publicación se puede encontrar en http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx .

El siguiente código .NET (global.asax) tiene una diferencia importante de que en lugar de *, puede ser mejor repetir el dominio de origen porque esto permite la autenticación a través de CORS (por ejemplo, NTLM / Kerberos), así como la verificación previa.

 void Application_BeginRequest(object sender, EventArgs e) { if (Request.HttpMethod == "OPTIONS") { Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); Response.AddHeader("Access-Control-Max-Age", "1728000"); Response.End(); } else { Response.AddHeader("Access-Control-Allow-Credentials", "true"); if (Request.Headers["Origin"] != null) Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]); else Response.AddHeader("Access-Control-Allow-Origin" , "*"); } }