2012-02-06 47 views
12

Estoy trabajando en una aplicación MVC. En mi borrador original del servicio tenía este método en uno de mis controladores:Habilitar solicitudes Http PUT en .NET MVC

[AcceptVerbs(HttpVerbs.Post)] 
    [ActionName("UpdateRelationship")] 
    public ActionResult UpdateRelationship(string aParameter) 

Y eso funcionó bien. En la última revisión, me pidieron que cambie esto en una solicitud PUT para diferenciarlo de un mecanismo de agregación similar que utiliza la publicación. Así que lo cambié a esto:

[AcceptVerbs(HttpVerbs.Put)] 
    [ActionName("UpdateRelationship")] 
    public ActionResult UpdateRelationship(string aParameter) 

Y de repente me estoy poniendo un 404 en mis solicitudes, todos ellos de tan solo cambiando las AcceptVerbs. A juzgar por el error, parece que IIS está intentando enrutar la solicitud como una página web estándar en lugar de utilizar la url de extensión de MVC sin extensión.

Buscando en Google esto parece que una causa común es que los navegadores no permiten las solicitudes PUT, pero no estoy usando un navegador para probar esto - Estoy usando Fiddler. Entonces no debería haber ningún problema allí. También creo que los ajustes correctos ya están en el web.config:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule" /> 
    </modules> 
    <handlers> 
     <remove name="UrlRoutingHandler" /> 
     <remove name="MvcHttpHandler" /> 
    <remove name="WebDAV" /> 
     <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    </handlers> 
    <security> 
     <requestFiltering> 
      <verbs> 
       <add verb="PUT" allowed="true" /> 
      </verbs> 
     </requestFiltering> 
    </security> 
</system.webServer> 

Entonces, ¿qué me he perdido?

EDITAR: Este código funciona en la máquina de un compañero. Entonces parece que mi configuración local de IIS fue la culpa. Todavía estoy en una pérdida para explicar lo que necesito cambiar, ¿alguna idea?

Saludos, Matt

+0

¿Está utilizando IIS Express o IIS de pura sangre? Si es de sangre pura, ¿en qué SO estás? –

+0

Es el que viene incorporado en Windows 7 pro, así que supongo que es expreso. –

Respuesta

3

La configuración que trabajó para nosotros fue la siguiente .

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="false"> 
     <remove name="UrlRoutingModule" /> 
     <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="" /> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
</system.webServer> 

Esto es específico de las URL sin extensión.

BTW la recomendación general es establecer runAllManagedModulesForAllRequests = false.

+1

La línea es incorrecta, debe ser ' ' – Tyrsius

8

tuve que quitar el módulo WebDav por completo un expresadas en this blog post

<configuration> 
    <system.webServer> 
    <handlers> 
     <remove name="WebDAV" /> 
     <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="%windir%\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="%windir%\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" /> 
    </handlers> 
    <modules> 
     <remove name="WebDAVModule" /> 
    </modules> 
    </system.webServer> 
</configuration> 
+0

Esto resolvió mi problema en el alojamiento compartido GoDaddy. Por defecto, solo GET y POST están habilitados, pero esto permitió PUT y DELETE (y HEAD) para mi api REST. –

+0

No te olvides de eliminar el módulo WebDAVModule como dice esta publicación, esa es la razón por la que no estaba funcionando en el host GoDaddy. – Lelis718

+1

Después de casi dos días de luchar contra este problema, me salvaste la vida. Gracias hombre. Esto realmente resolvió mi problema con GO_TRASH_DADDY. –