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

145

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 servidor da web padrão.

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

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, não vejo nenhuma maneira de fazer isso com o IIS 8.

Eu tentei editar as seções WebDav do applicationhost.config, mas isso não ajudou. Por exemplo, eu removi <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />do arquivo de configuração.

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

Marca
fonte
Isso ainda está quebrado na versão RTM. Só perdi 3 horas com isso ... Tudo o que era necessário era adicionar verbos extras ExtensionlessUrl-Integrated-4.0.
Leppie
1
Eu não acho que isso está quebrado, mas é por design. Eu acho que mudar o comportamento padrão interferiria com o WebDAV e quebraria a compatibilidade com versões anteriores. Isso também não funcionou com o IIS7 quando o WebDAV foi instalado.
Mark
Eu também desperdicei 3 horas nisso ... 6 anos após este post.
Brian Jenkins
Para obter mais informações, consulte: stackoverflow.com/a/55134621/4746570 #
BehrouzMoslem

Respostas:

162

OK. Finalmente cheguei ao fundo disso. Você precisa percorrer algumas etapas para que os verbos PUT e DELETE funcionem corretamente com o IIS8. De fato, se você instalar o candidato a lançamento do VS 2012 e criar um novo projeto de API da WEB, verá que os métodos PUT e DELETE de amostra retornam erros 404 imediatamente.

Para usar os verbos PUT e DELETE com a API da Web, você precisa editar% userprofile% \ documents \ iisexpress \ config \ applicationhost.config e adicionar os verbos ao manipulador ExtensionlessUrl da seguinte maneira:

Mude esta linha:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

para:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

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 em applicationhost.config.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

Lembre-se também de que a convenção padrão da API da Web é que o nome do seu método seja igual ao verbo HTTP invocado. Por exemplo, se você estiver enviando uma solicitação de exclusão HTTP, seu método, por padrão, deverá ser chamado de Excluir.

Marca
fonte
9
Para problemas semelhantes com o verbo OPTIONS no IIS8 (onde algo mais está interceptando antes de seus manipuladores), tente <remove name = "OPTIONSVerbHandler" /> no seu web.config. Para essa matéria, eu aconselharia utilizando a técnica de "remover" no seu web.config local sobre mexer com applicationhost.config quando possível, como regra geral
Jason
7
Em vez de remover o WebDAV no nível do servidor, que pode ter efeitos indiretos, é melhor removê-lo do seu projeto, como mostrado aqui: stackoverflow.com/a/14465655/428280
Twisted
E depois o que? Pode ser ainda que vai funcionar localmente, mas não funcionará em Azure
Toolkit
3
Uma resposta que instrui a modificar as configurações do sistema, mesmo em máquinas de desenvolvimento, não pode ser uma resposta. Isso resolve um sintoma e não ajuda muito nas equipes e na produção. Você replicará isso em todas as máquinas? Confira a resposta de Santosh Sah.
André Werlang
Além disso, eu também precisei remover a WebDAVModuleseção dos módulos, conforme resposta de Santosh Sah .
Ivaylo Slavov
125

Altere o arquivo Web.Config como abaixo. Agirá como charme.

No nó, <system.webServer>adicione abaixo a parte do código

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

Após adicionar, o seu Web.Config será semelhante a abaixo

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <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>
</system.webServer>
Santosh Prasad Sah
fonte
3
Remover o WebDavModule é a maneira correta de solucionar esse problema.
MissRaphie 19/09/2014
6
Salvei o meu dia: <módulos runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </modules>
Peter Stegnar
3
Cabeçalhos personalizados não devem ser necessários, pois estão relacionados ao CORS e dessa maneira você está induzindo a uma falha de segurança. Apenas a parte relativa WebDAVModuleé relevante.
André Werlang
2
Esta resposta está correta, com a única exceção de que o nome do manipulador pode diferir entre as versões do IIS - por exemplo, o 7.5 usa "ExtensionlessUrlHandler-Integrated-4.0"(como na resposta acima), enquanto o IIS 8.5 renomeou o nome para "ExtensionlessUrl-Integrated-4.0"(também mencionado por Mark S. O nome do manipulador é mostrado em a página de erro do IIS, uma vez que você receber o erro, por isso deve ser trivial para saber qual a set Eu uso ambos os nomes, a fim de suportar diferentes ambientes de hospedagem..
Ivaylo Slavov
7
Isso me faz morrer um pouco por dentro toda vez que vejo isso - runAllManagedModulesForAllRequests = "true" - como uma solução britishdeveloper.co.uk/2010/06/…
Oliver
61

Remover o WebDAV funciona perfeitamente para o meu caso:

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.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>

é sempre melhor resolver o problema através do web.config em vez de corrigi-lo através do iis ou machine.config para garantir que isso não aconteceria se o aplicativo hospedasse em outra máquina

Peter.Wang
fonte
Isso funcionou para mim, onde os outros não, por algum motivo (estava no IIS 8.5), obrigado #
John John
4
Remover WebDAVModule funcionou para mim, não há necessidade de remover o manipulador WebDAV (IIS 8.0).
31416 PeterS
3
apenas removendo o webdav funciona no framework 4.6.2 iis8.5
Abdul Rehman Sayed
45

Atualize seu web.config

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

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.

Chris Marisic
fonte
1
Eu já estava escrito outra linha, mas não estava funcionando. depois de adicionar as linhas <remove name = "WebDAVModule" /> e <remove name = "WebDAV" />, ele está funcionando agora. Muito obrigado e 1 voto positivo do meu lado.
Banketeshvar Narayan 08/09/16
Isso funciona, mas pode falhar devido ao bloqueio da configuração, impedindo o uso de <modules> no web.config. Nesse caso, você deve desativar o bloqueio de configuração em applicationHost.config. Se você não tiver controle sobre applicationHost.config por algum motivo, essa abordagem não poderá ser usada.
Florian Winter
Trabalhei com o IIS10, embora eu apenas tenha usado "*" como verbo
Javier G.
1
Trabalhei com o IIS 10 e a API da Web 2. Trabalhei, devo acrescentar, depois de mais uma dúzia de "soluções" que encontrei on-line não. Obrigado!
Matt West
@ ChrisMarisic: Isso funcionou como um encanto para mim, obrigado!
Div Tiwari
18

Na API da Web do Asp.Net - webconfig. Isso funciona em todos os navegadores.

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

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

Substitua a tag system.webserver pelo código abaixo

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<validation validateIntegratedModeConfiguration="false" />
<handlers>
  <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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>

Ganesh
fonte
Eu tive esse problema no IIS 7.5 e essa correção funcionou perfeitamente. Em vez de excluir todo o conteúdo do meu system.webserver, acabei de mesclar as configurações relevantes acima nas minhas próprias configurações.
Keith Walton
38
CUIDADO : A seção de cabeçalhos personalizados no código acima permite que QUALQUER site chame sua API a partir de um navegador - o que é um grande risco à segurança . Leia sobre o CORS, que é efetivamente o que esses cabeçalhos estão ativando.
profMamba
Também tive esse problema no iis 7.5 e isso funcionou. Certifique-se de ler a mensagem do Toolkit acima sobre o risco envolvido na abertura de cors para todos. Também voto seu comentário, porque petiscos como esse são muito valiosos.
sjdirect
Não acho que você precise de cabeçalhos personalizados neste caso. O restante da system.webserverseção deve ser suficiente - verifique se você tem o nome correto para o manipulador de URL sem extensão.
Ivaylo Slavov
1
@niico Você deve permitir que apenas sites confiáveis ​​acessem o Controle de Acesso-Permitir Origem, ou seja, substitua "*" pelo URL do (s) site (s). Essa propriedade é uma lista branca de todos os sites confiáveis, a menos que você queira confiar na Web inteira (o que geralmente é uma má ideia).
ProfMamba #
5

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

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>
Sico
fonte
Quando você executa o AppCmd, é isso que coloca o seu web.Config (exceto o bit applyToWebDAV).
Chase Florell
5

Apenas uma atualização rápida para qualquer pessoa que possa encontrar esse problema. Atualmente, a alteração do% userprofile% \ documents \ iisexpress \ config \ applicationhost.config NÃO funciona mais (isso funcionava bem até agora, não tendo certeza se isso se deve a uma atualização do Windows). Após horas de frustração, mudei o web.config para adicionar esses manipuladores ao system.webserver para fazê-lo funcionar:

<handlers>
        <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>
Hari
fonte
4

Ativar CORS (agradável e arrumado)

1.Add pacote de pepitas CORS

Install-Package microsoft.aspnet.webapi.cors

2. No arquivo WebApiConfig.cs para o 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.Adicione o código abaixo ao namespace do controller, incluindo 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<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

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

zokaee hamid
fonte
4

Depois que nada funcionou, consegui resolver isso seguindo as etapas abaixo:

• Não selecionou as configurações do IIS 'WEB DAV PUBLISHING' durante a instalação do IIS. • INETMGR - site padrão - filtragem de solicitações - verbos HTTP - PUT como verdadeiro

Anshuman Saurabh
fonte
3

Após inúmeras pesquisas e tentativas das respostas já fornecidas (adicionando os verbos PUT, DELETE e remova o WEBdav), 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, procurou o arquivo de log mais recente e viu esta entrada: GET / Rejeitado por UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

O método Update foi listado com o verbo GET, estranho, certo? Pesquisei no Google Rejeitado por UrlScan e encontrei este link: UrlScan Quebrou meu blog .

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

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

Servidor Web do Windows 2008 R2 (64 bits), IIS 7.5. 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)
DHFW
fonte
3

Para PHP, era 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. na guia verbos, selecione "um dos verbos a seguir" e adicione "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"

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

Frank Forte
fonte
2

Além de todas as soluções acima, verifique se você tem o " id " ou algum parâmetro definido personalizado no método DELETE que corresponde à configuração da rota.

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

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

A configuração da rota, por padrão, procurará o ID no URL. Portanto, o nome do parâmetro id é 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: Verifique também se você passa os dados pela URL e não pelo método de dados que transportará a carga como conteúdo do corpo.

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

Exemplo:

DELETE http://localhost/item/1

Espero que ajude.

Uma corrida
fonte
2

Eu enfrentei o mesmo problema com você e, em seguida, resolvi-o. Aqui estão as soluções, desejo que talvez possa ajudar
Primeira

Na modulesconfiguração do IIS , faça um loop do WebDAVModule , se o servidor da web tiver, e remova-o

Segundo

Na handler mappingsconfiguração do IIS , você pode ver a lista de manipuladores ativadores, para escolher the PHP item, editá-lo, na página de edição, clique no botão de solicitação de restrições e, em seguida, selecione the verbs tabno modal, especifique os verbos a serem manipulados, verifique o all verbs radioe clique em ok, talvez você também veja um aviso, ele mostra que usamos aspas duplas na execução do PHP-CGI e, em seguida, faça isso

Se tiver feito, reinicie o servidor IIS; tudo ficará bem

insira a descrição da imagem aqui

Chauncery
fonte
1
Eu só removeu WebDAVModule do site IIS e que funcionou para mim
Umair Malhi
1

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

  1. abra% perfil de usuário% \ ducuments \ iisexpress \ config \ applicationhost.config

  2. Por padrão, as entradas fornecidas são comentadas no arquivo applicationhost.config. descomente essas entradas.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


<add name="WebDAVModule" />
<add name="WebDAV" path="*"
 verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
 modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
 />
vikomall
fonte
4
mexendo com applicationhost.config? nope
Toolkit
Não se deve mexer com outro arquivo que não seja o de configuração do aplicativo. Primeiro - você fará isso para todo o servidor e esquecerá: muitas pessoas se perguntarão como isso funciona nesta máquina e não funciona no resto. Além disso, se você não tiver acesso permitido ao arquivo de configuração do IIS no servidor em que o aplicativo está hospedado, será necessário resolvê-lo no web.config. Imagine que seu servidor de desenvolvimento possui a atualização acima, seu web.config será preciso? É uma ótima maneira de perder o dia de alguém em investigar por que a implantação de produção falhou
Ivaylo Slavov
1

Aqui está como você permite verbos HTTP extras usando a GUI do Gerenciador do IIS.

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

  2. Clique na opção "Solicitar filtragem". Clique na guia "HTTP Verbs".

  3. Clique no link "Permitir verbo ..." na barra lateral.

  4. Na caixa exibida, digite "DELETE", clique em OK.

  5. Clique no link "Permitir verbo ..." na barra lateral novamente.

  6. Na caixa que aparece, digite "PUT", clique em OK.

Chaoix
fonte
boa tentativa - algo diferente pela primeira vez - mas ainda não funcionou!
ozzy432836
Eu tentei de tudo o que vi sugerido no SO e em outros lugares. Finalmente tentei isso e funcionou perfeitamente. No meu caso, os verbos PUT e DELETE já estavam na lista e eu tive que removê-los primeiro e adicioná-los novamente usando o link Permitir Verbo ..., mas ainda assim, funcionou quando nada mais existia. Muito obrigado!
JTennessen
1

Estou usando um arquivo ashx em um aplicativo MVC e nenhuma das respostas acima funcionou para mim. IIS 10.

Aqui está o que funcionou. Em vez de alterar " ExtensionlessUrl-Integrated-4.0 " no IIS ou web.config, alterei " SimpleHandlerFactory-Integrated-4.0 " para arquivos " * .ashx ":

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />
RC Cola
fonte
0

O outro motivo pode ser o seguinte:
Alterei meu método URL para API da Web de acordo com esta resposta :

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

Mas esse método cria um 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 apenas substituí-lo por:

/api/MyApiCtrl

e resolveu o problema.

Nicolai
fonte
0

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

O que me ajudou foram os passos abaixo;

  1. Eu fui ao gerente do IIS.
  2. No painel esquerdo, selecione o site.
  3. Na área de trabalho esquerda, selecione o WebDAV, clique duas vezes em Abrir.
  4. No painel mais à direita, desative-o.

Agora tudo está funcionando.

habilidade
fonte
-1

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

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