2010-11-26 15 views
10

Tengo un servicio web que alojo en mi máquina. Uso Windows 7 e IIS 7.5.IIS 7.5, Servicio web y error HTTP 405

Problema: Cuando el cliente intenta consumir el servicio web, obtiene un error HTTP 405.

En el archivo de registro de IIS, puedo ver que esto se rechaza porque el verbo POST no está permitido.

Pregunta: ¿Cómo puedo permitir verbo POST para esas solicitudes?
¿Debo agregar la asignación del archivo WSDL? Y si lo hago, ¿cómo debo configurar este mapeo? Lo he comprobado, y en las asignaciones existentes no tengo nada para la extensión WSDL.

¿Hay algo más que configurar en IIS para permitir esas solicitudes?

El servicio web se crea utilizando WCF.

+0

Asegúrese de que ve esto: http : //support.microsoft.com/kb/2015129 –

Respuesta

14

Después de horas de lucha, esta es la solución final que me ayudó (probado de violinista):

  1. En IIS 7.5 -> yourwebsite -> Asignaciones de controlador
  2. seleccione "Agregar correlación del módulo" opción en el lado derecho del panel
  3. en el campo "Solicitud de surco" ingrese * .wsdl
  4. en el campo "Módulo" entrar "ProtocolSupportModule"
  5. Haga clic en "Solicitar restricciones" y vaya a la pestaña Verbos
  6. Introduzca verbo POST
  7. Guardar cambios

voila Fin, El violinista no responde ya con 405 pero con feliz 200.

+0

Buhtla, si esta es la respuesta que le solucionó el problema, márquelo como tal con la marca de verificación verde. Esto está permitido (y fomentado) en SO. – Peter

+0

Me ayudó después de buscar toda la mañana para una solución - gracias – Matt

+0

¿Cómo se enteró de esto @buhtla? Funcionó para mí: ¡muchas gracias!Pero creo que también sería útil publicar la URL desde donde obtuvo esta información y, por favor, marque como respuesta porque será más fácil para otros encontrar la solución. –

2

Administrador de IIS Goto -> Seleccione Sitio Web -> Handler Mapping -> Seleccionar el manejador -> botón derecho del ratón y seleccione Editar -> Solicitar restricciones -> pestaña verbos

Cambiar el valor allí.

Dependiendo de su extensión, podría ser un controlador diferente.

+0

Sí, pero ¿para qué controlador? No tengo ningún controlador específico para la extensión wsdl. – buhtla

+0

Para el servicio web es (* .asmx) WebServiceFactoryHandler – Aliostad

+0

Estoy implementando esto con WCF, por lo que esta es en realidad la extensión .svc. Ya lo he comprobado, y para la extensión svc, todos los verbos están permitidos. Todavía obtengo el mismo error ... – buhtla

6

La respuesta aparece no funcionó para mí, pero yo era capaz de solucionar el problema mediante la ejecución de

"% windir% \ Microsoft.Net \ Framework \ v3.0 \ Windows Communication Fundación \ ServiceModelReg.exe" -r

Esta vuelto a registrar la asignación de controlador para *. svc

1

Para las personas que se topan con esta página pero que están realizando solicitudes a una aplicación web con páginas aspx, en lugar de servicios, hay una cosa importante a tener en cuenta.

Si usted hace una petición http violinista post para http://localhost/MyApplication, lanzará el estado 405. Pero si especifica http://localhost/MyApplication/Default.aspx lugar, responderá correctamente (con estado 200)

Espero que esto ayude.He estado buscando en el lugar equivocado durante una hora, depurando manipuladores, módulos, configuraciones de webdav, verbos http, etc.

0

Ahh - Finalmente he encontrado una solución para mis CORS en IIS. Este fue uno de los problemas que surgieron durante la búsqueda de mi solución.

La respuesta correcta es aliostad's - El problema proviene del hecho de que para algunas soluciones para implementar el verbo 'OPTIONS', se recomienda eliminar el mapeo de ese verbo al ProtocolSupportModule. O tal vez alguien acaba de limpiar las asignaciones innecesarias, etc. Esto no dejó ningún controlador para OPCIONES.

yo no soy un experto en exactamente lo que sucede detrás de las escenas, pero parece que IIS se asegura de que hay un controlador de potencial para la solicitud mucho antes de que se dispare el evento Application_BeginRequest, esto a pesar de sus diagramas de secuencia:

https://msdn.microsoft.com/en-us/library/bb470252.aspx

Así se devuelve el estado 405 sin ejecutar su módulo. Lo que se envía al servidor es por ejemplo:

OPTIONS http://www.example.com/path/mypage.aspx 

Así IIS está buscando un controlador para * .aspx que acepta el verbo OPCIONES. Si nos fijamos en su archivo applicationHost.config predeterminado, verá, por ejemplo:

 <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" /> 
     <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" /> 

acabo habían hecho lo siguiente en mi web.config para hacer de estado de parada de IIS que regresan 200 noops:

 <remove name="OPTIONSVerbHandler" /> 

por lo tanto, tratando de que en un primer momento, y la conclusión de que esto es lo que se necesitaba, que añade lo siguiente a mi web.config:

 <remove name="PageHandlerFactory-ISAPI-4.0_32bit" /> 
     <remove name="PageHandlerFactory-ISAPI-4.0_64bit" /> 
     <remove name="PageHandlerFactory-Integrated" /> 
     <remove name="PageHandlerFactory-Integrated-4.0" /> 

     <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" /> 
     <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" /> 

Tenga en cuenta que los reemplazos se ajustan a lo que está en applicationHost.config, excep t con el verbo adicional OPTIONS agregado a cada línea.

Para aquellos de ustedes que están utilizando enrutamiento (MVC o WebAPI por ejemplo):

 <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 

     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

Por último, no soy un experto en IIS - quizás hay una manera más eficiente diferente de manejar el verbo OPCIONES para CORS (más específicamente, permita que su controlador CORS funcione sin la solución parcial de 'encabezado personalizado', estoy abierto a esas soluciones.

Cuestiones relacionadas