Error de WCF: 405 Método no permitido

Enloqueciendo con este problema. Tengo una solución con 2 proyectos, uno de ellos es un viejo y simple html con llamada jquery ajax, mientras que el otro es un servicio WCF. La página html emitirá una llamada ajax al servicio WCF para obtener una cadena json y utilizarla para fines de visualización.

Ahora el problema es que cada vez que ejecuto en modo de depuración, tanto la página html como la WCF se iniciarán con un puerto diferente. Y esto ha creado un problema de origen cruzado para mí cuando realizo las pruebas (es decir, obtengo un error 405 Method Not Allowed con el tipo de llamada = OPTIONS en Firefox). Verificaría el método de llamada en mi script ajax y el servicio WCF es el mismo (GET).

Buscaba en Google pero descubrí que o bien tengo que instalar una extensión o realizar alguna configuración en IIS, lo que me parece engorroso, ya que lo que estoy haciendo es algo simple. Siguiendo un ejemplo, agregaría la siguiente configuración en mi web.config pero no funcionó:

                                      

¿Alguien tiene alguna idea para deshacerse de este problema molesto?

EDITAR: solo para agregar, estoy ejecutando la depuración con IIS Express que viene junto con VS Studio 2012

Agregue el código WCF y actualice web.config

 [ServiceContract] public interface IMemberInfo { [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json )] [OperationContract] string GetMemberInfoById(); // TODO: Add your service operations here } 

Mi guión:

 $(document).ready(function () { $.ajax("http://localhost:32972/SimpleMemberInfo.svc/GetMemberInfoById", { cache: false, beforeSend: function (xhr) { $.mobile.showPageLoadingMsg(); }, complete: function () { $.mobile.hidePageLoadingMsg(); }, contentType: 'application/json', dataType: 'json', type: 'GET', error: function () { alert('Something awful happened'); }, success: function (data) { var s = ""; s += "
  • " + data + "
  • "; $("#myList").html(s); } }); });

    Necesita usar JSONP para una llamada entre dominios para sortear las restricciones del navegador y actualizar su web.config con crossDomainScriptAccessEnabled establecido en true para obtener los redondos del servidor. Hay un buen ejemplo en la respuesta aquí: ¿cómo evitar la política de dominio cruzado en jquery ajax para consumir el servicio wcf?

    También puede tener un problema con las solicitudes GET. Pruebe las soluciones aquí descritas: hacer que un servicio web de WCF funcione con las solicitudes GET

    En total, quieres un web.config que se vea así:

                            

    (Tenga en cuenta que tanto el servicio como el punto final tienen comportamientos adjuntos, que permiten llamadas webHttp y llamadas httpGet, respectivamente, y que el enlace tiene habilitado explícitamente el acceso crossDomain).

    … un método de servicio decorado así:

     [ServiceContract] public interface IMyService { [WebGet] // Required Attribute to allow GET [OperationContract] string MyMethod(string MyParam); } 

    … y una llamada de cliente usando JSONP:

      

    Sin embargo, es un hilo antiguo, pero me gustaría añadir mi comentario sobre los problemas que enfrenté y la solución que obtuve para trabajar con CORS. Estoy desarrollando un servicio web en el siguiente entorno:

    1. Servicio web de WCF.
    2. .NET 3.5 framework.
    3. Se agregó el servicio web wcf en el sitio web asp.net existente.
    4. Visual Studio 2008

    La mayoría de las personas mencionaron agregar el atributo crossDomainScriptAccessEnabled en la etiqueta en en web.config. No estoy seguro de si funciona o no, pero no está disponible en la versión 3.5, así que no tuve otra opción. También encontré que agregar las siguientes tags en web.config funcionará …

    pero no tuve suerte … seguí recibiendo 405 errores no permitidos por el método

    Después de luchar mucho con estas opciones, encontré otra solución para agregar estos encabezados en el archivo global.asax de forma dinámica como se indica a continuación …

     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("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } 

    Y elimine el de web.config. Publique el sitio web y continúe con jquery / ajax del lado del cliente … y obtendrá los datos de las llamadas de API. ¡Buena suerte!

    Solo quería agregar algunos problemas con la revisión de CORS en la parte inferior: el problema es que si su entrada no es compatible con el método GET y POST, la solicitud OPTIONS realmente no está devolviendo los encabezados permitidos correctos. Realmente no se buscan los métodos realmente permitidos en el punto final de la WCF: solo se dice artificialmente “GET, POST” para cada punto final de la aplicación cuando un cliente realiza una solicitud OPTIONS (que es realmente el cliente que pregunta qué esta apoyado).

    Probablemente esto esté bien, si realmente no confía en la información del método OPTIONS para devolverle una lista de métodos válida (como es el caso con algunas solicitudes CORS), pero si lo hace, deberá hacer algo como: la solución a esta pregunta: cómo manejar la solicitud AJAX JQUERY POST con autocaptura WCF

    Básicamente, cada punto final debe implementar:

    Webinvoke(Method="OPTIONS", UriTemplate="")

    y llame a un método apropiado que cargue los encabezados adecuados a la respuesta (incluida la lista adecuada “Access-Control-Allow-Method” para ese punto final) a la persona que llama. De alguna manera apesta que los puntos finales WCF alojados no lo hagan por nosotros automáticamente, pero esta es una solución alternativa que permite un control más preciso sobre el punto final. En esa solución, los encabezados de respuesta adecuados se cargan en la implementación del punto final:

     public void GetOptions() { // The data loaded in these headers should match whatever it is you support on the endpoint // for your application. // For Origin: The "*" should really be a list of valid cross site domains for better security // For Methods: The list should be the list of support methods for the endpoint // For Allowed Headers: The list should be the supported header for your application WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); } 

    tratar de usar. WebInvoke(Method = "POST") lugar de WebInvoke(Method = "GET")