API da Web do ASP.NET – PUT & DELETE Verbs não permitidos – IIS 8

Recentemente, atualizei do Visual Studio 2010 para o Visual Studio 2012 RC. O instalador também instala o IIS 8 Express, que o Visual Studio agora usa como o servidor da Web padrão.

O IIS 8 está bloqueando minhas solicitações de API da WEB que usam verbos PUT e DELETE. IIS retorna um erro 405, The requested resource does not support http method 'PUT' .

Eu sei que as pessoas têm problemas com isso no passado e há várias mensagens sobre isso no Stack Overflow. Com o IIS 7 Express, a solução foi desinstalar o WebDav. Infelizmente eu não vejo nenhuma maneira de fazer isso com o IIS 8.

Eu tentei editar as seções WebDav de applicationhost.config, mas isso não ajudou. Por exemplo, eu removi do arquivo de configuração.

Eu passei muito tempo nisso. Deve haver uma maneira simples de ativar PUT e DELETE?

    OK. Eu finalmente cheguei ao fundo disso. Você precisa pular alguns aros para obter os verbos PUT e DELETE funcionando corretamente com o IIS8. Na verdade, se você instalar o release candidate do VS 2012 e criar um novo projeto de API WEB, verá que os methods PUT e DELETE de amostra retornam erros 404 fora da checkbox.

    Para usar os verbos PUT e DELETE com a API da Web, é necessário editar% userprofile% \ documents \ iisexpress \ config \ applicationhost.config e include os verbos no manipulador ExtensionlessUrl da seguinte forma:

    Altere esta linha:

      

    para:

      

    Além do acima, você deve garantir que o WebDAV não esteja interferindo em suas solicitações. Isso pode ser feito comentando as seguintes linhas do applicationhost.config.

        

    Também esteja ciente de que a convenção padrão da API da Web é que o nome do método deve ser o mesmo que o verbo HTTP chamado. Por exemplo, se você estiver enviando uma solicitação de exclusão HTTP, seu método, por padrão, deverá ser denominado Excluir.

    Altere seu arquivo Web.Config como abaixo. Vai agir como charme.

    No nó adicione a parte abaixo do código

        

    Depois de adicionar, seu Web.Config ficará como abaixo

                          

    Remover o WebDAV funciona perfeitamente para o meu caso:

             

    é sempre melhor resolver o problema através do web.config em vez de consertá-lo através do iis ou do machine.config para o beneficiário, isso não aconteceria se o aplicativo estivesse hospedado em outra máquina

    Atualize seu web.config

                

    http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

    Remove a necessidade de modificar suas configurações de host.

    Em Asp.Net Web API – webconfig. Isso funciona em todos os navegadores.

    Adicione o seguinte código dentro da tag System.web

           

    Substitua sua tag system.webserver por este código abaixo

                        

    isso funcionou para mim no iis8 junto com algumas das outras respostas. Meu erro foi um 404.6 especificamente

              

    Apenas uma atualização rápida para qualquer outra pessoa que possa encontrar esse problema. A partir de hoje, alterar o% userprofile% \ documents \ iisexpress \ config \ applicationhost.config NÃO funciona mais (isso estava funcionando bem até agora, não tenho certeza se isso é devido a uma atualização do Windows). Depois de horas de frustração, mudei o web.config para adicionar esses manipuladores ao system.webserver para fazê-lo funcionar:

             

    Ativar o CORS (legal e limpo)

    Pacote do nuget do CORS 1.Add

     Install-Package microsoft.aspnet.webapi.cors 

    2. no arquivo WebApiConfig.cs no método Register adicione o seguinte código:

     config.EnableCors(); 

    ex:
    using System.Web.Http;

     namespace test { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services config.EnableCors(); //add this************************** // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } } 

    3.Adicionar código abaixo no namespace do controlador incluem get, post, delete, put ou qualquer método http

     [EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")] 

    ex:

     using System.Web.Http.Cors;//add this****************************** namespace Test.Controllers { [EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")] public class RestaurantController : ApiController { protected TestBusinessLayer DevTestBLL = new TestBusinessLayer(); public List GET() { return DevTestBLL.GetRestaurant(); } public List DELETE(int id) { return DevTestBLL.DeleteRestaurant(id); } } } 

    referência: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

    Depois que nada funcionou, consegui resolver isso seguindo os passos abaixo:

    • Não selecionou as configurações do IIS ‘WEB DAV PUBLISHING’ durante a instalação do IIS. • INETMGR – Site Padrão – Filtragem de Pedidos – Verbos HTTP – PUT como Verdadeiro

    Depois de uma busca sem fim e tentando as respostas já fornecidas (adicionando o PUT, APAGAR verbos e remover o WEBdav) ele simplesmente não funcionou.

    Eu fui para as configurações de log do IIS:> Exibir arquivos de log. No meu caso, W3SVC4 foi a pasta com a data mais recente, abriu a pasta, consultou o arquivo de log mais recente e viu a seguinte input: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

    O método Update foi listado com o verbo GET, estranho né? Então eu pesquisei no Rejected-By-UrlScan e encontrei este link: UrlScan Broke My Blog .

    Eu fui para aqui:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

    Basicamente, o UrlScan bloqueia verbos PUT e DELETE. Eu abri este arquivo INI, adicionei o PUT e o DELETE ao AllowVerbs e os removi das listagens do DenyVerbs. Salvei o arquivo INI e funcionou! Então, para mim, essas etapas foram necessárias ao lado das dicas do ExtensionlessUrlHandler.

    Windows Webserver 2008 R2 (64 bits), IIS 7.5. Eu estou usando isso em combinação com o DotNetNuke (DNN) WebAPI. ASP.Net 4.0 Meu método de atualização:

     [HttpPut] [DnnAuthorize(StaticRoles = "MyRoleNames")] public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData) 

    Para o PHP, foi simplesmente:

    1. Abra o IIS
    2. Ir para mapeamentos de manipulador
    3. clique em editar no php5.6.x ou php7.0.x
    4. clique em “solicitar restrições”
    5. sob a guia verbs, selecione “um dos seguintes verbos” e adicione “GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS”

    Eu imagino que isso funcionará com outros manipuladores também.

    Além de todas as soluções acima, verifique se você tem o ” id ” ou qualquer parâmetro personalizado definido no método DELETE está correspondendo à configuração da rota.

     public void Delete(int id) { //some code here } 

    Se você acertar com erros 405 repetidos, redefina melhor a assinatura do método como padrão acima e tente.

    A configuração da rota, por padrão, procurará id no URL. Portanto, o id do nome do parâmetro é importante aqui, a menos que você altere a configuração da rota na pasta App_Start .

    Você pode alterar o tipo de dados do id .

    Por exemplo, o método abaixo deve funcionar bem:

     public void Delete(string id) { //some code here } 

    Nota: Assegure-se também de passar os dados pela url e não pelo método de dados que carregará a carga útil como conteúdo do corpo.

     DELETE http://{url}/{action}/{id} 

    Exemplo:

     DELETE http://localhost/item/1 

    Espero que ajude.

    Não tenho certeza se você editou o arquivo de configuração correto. Tente seguir os passos

    1. abra% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

    2. Por padrão, abaixo, as inputs dadas são comentadas no arquivo applicationhost.config. descomente estas inputs.

       
      

    Veja como você permite verbos HTTP extras usando a GUI do Gerenciador do IIS.

    1. No Gerenciador do IIS, selecione o site para o qual você deseja permitir PUT ou DELETE.

    2. Clique na opção “Request Filtering”. Clique na guia “Verbos HTTP”.

    3. Clique no link “Permitir Verbo …” na barra lateral.

    4. Na checkbox que aparece, digite “DELETE”, clique em OK.

    5. Clique no link “Permitir Verbo …” na barra lateral novamente.

    6. Na checkbox que aparece, digite “PUT”, clique em OK.

    Eu enfrentei o mesmo problema com você, então resolvi, Aqui estão as soluções, eu desejo que talvez possa ajudar
    Primeiro

    Na configuração dos modules do IIS, faça o loop do WebDAVModule , se o servidor da Web o tiver, remova-o

    Segundo

    Na configuração de handler mappings do IIS, você pode ver a lista do manipulador de ativação, para escolher the PHP item , editá-lo, na página de edição, clicar no botão de restrições de solicitação e selecionar the verbs tab no modal, no especificar os verbos a seja identificador de identificador, verifique a all verbs radio , em seguida, clique em ok, você também pode ver um aviso, ele nos mostra que usar aspas duplas para execução PHP-CGI, então faça isso

    se feito isso, reinicie o servidor IIS, será ok

    insira a descrição da imagem aqui

    O outro motivo pode ser o seguinte:
    Eu mudei meu método Url for Web Api de acordo com esta resposta :

     Url.Action("MyAction", "MyApiCtrl", new { httproute = "" }) 

    Mas esse método cria link como:

     /api/MyApiCtrl?action=MyAction 

    Isso funciona corretamente com solicitações GET e POST, mas não com PUT ou DELETE.
    Então eu acabei de substituí-lo com:

     /api/MyApiCtrl 

    e resolveu o problema.

    Você pode converter seu método Delete como POST como;

      [HttpPost] public void Delete(YourDomainModel itemToDelete) { } 

    No IIS 8.5 / Windows 2012R2, nada mencionado aqui funcionou para mim. Eu não sei o que significa remover o WebDAV, mas isso não resolveu o problema para mim.

    O que me ajudou são os passos abaixo;

    1. Eu fui ao gerenciador do IIS.
    2. No painel esquerdo, selecione o site.
    3. Na área de trabalho esquerda, selecione o WebDAV, Opened it clicando duas vezes.
    4. No painel da direita, desativado.

    Agora tudo está funcionando.