API Web Asp.NET - 405 - Le verbe HTTP utilisé pour accéder à cette page n'est pas autorisé - comment définir les mappages de gestionnaire

106

J'ai écrit le service REST à l'aide de l'API Web ASP.NET. J'essaie d'envoyer une demande HttpDelete, mais j'obtiens l'erreur suivante:

405 - Le verbe HTTP utilisé pour accéder à cette page n'est pas autorisé

Je pense que je suis proche de la solution, j'ai découvert que je devais activer la gestion à distance IIS, aller à la section Mappages des gestionnaires et ajouter le verbe DELETE à la position appropriée ... mais le problème est qu'il y a beaucoup de positions différentes sur la liste ... (qc comme ici: http://www.somacon.com/p126.php ).

Lequel dois-je modifier? Peu d'entre eux n'ont pas d'extension, par exemple "ExtensionUrlHandler-Integrated-4.0" et j'y ai ajouté le verbe DELETE, mais cela ne fonctionne toujours pas ...

C'était juste une photo dans le noir pour modifier celle-là, alors devrais-je modifier une position différente? Si oui, lequel? Ou y a-t-il autre chose que je devrais faire?

Le même service Web fonctionne parfaitement sur mon service local, donc je suppose que le problème vient de l'IIS distant ...

Salutations

Bart
la source
3
Salut Bart. Pouvez-vous changer la réponse en web.config? C'est vraiment mieux que de le désinstaller. et vous avez beaucoup de téléspectateurs
Ashkan Sirous

Réponses:

28

La cause commune de cette erreur est WebDAV . Assurez-vous de le désinstaller.

Darin Dimitrov
la source
Je l'ai désactivé, mais cela n'a pas aidé
Bart
3
La désactivation n'aide pas, vous devez le désinstaller.
John_
Je peux confirmer que la désactivation n'aide pas. @John_ a raison, vous devez désinstaller.
Mike L
7
La réponse de giacomelli ci-dessous doit être marquée comme correcte pour cette question; c'est une solution locale qui ne vous oblige pas à désinstaller WebDav.
Joseph Woodward
1
@ B.ClayShannon WebDAV n'est pas un programme autonome, c'est une fonctionnalité IIS. Donc, en fonction de votre système d'exploitation, vous devez le trouver sous Windows features / roles / roles services / ... tout ce qu'ils trouvent bon à inventer pour le classer. Mais si la modification de web.config n'a fait aucune différence, cela signifie que vous rencontrez quand même un autre problème.
Frédéric
359

Vous n'avez pas besoin de désinstaller WebDAV, ajoutez simplement ces lignes au web.config:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
Giacomelli
la source
1
Cela a bien fonctionné. Il faut tout utiliser; inclure les deux lignes "remove name = ...".
Chris Patterson
51
Cela devrait être la réponse acceptée à mon avis, car il s'agit d'une solution locale au lieu d'une solution globale.
Marco Mp
3
cela m'est venu juste avant une énorme démo demain matin. tu m'as littéralement sauvé la vie.
Sonic Soul
27
"vous m'avez littéralement sauvé la vie" - Soudain, mes clients ne semblent pas si mal.
Brandon Gano
3
Excellente réponse. Je conviens que cela devrait être la réponse acceptée. Cela m'a fait me sentir bien mieux que de désinstaller complètement WebDAV de notre serveur Web.
mituw16
18

Modifiez votre fichier Web.Config comme ci-dessous

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Hithesh
la source
1
L'ajout de supprimer WebDAV et WebDAVMODULE a permis les fonctions PUT et DELETE. Merci.
Gfw
Ça s'est enflammé quand j'ajoute le code ci-dessus dans mon fichier webconfig de projet api
Baqer Naqvi
15

Modifiez votre fichier Web.Config comme ci-dessous. Cela agira comme du charme.

Dans le nœud, <system.webServer>ajoutez ci-dessous une partie du code

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

Après l'ajout, votre Web.Config ressemblera à ci-dessous

<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
la source
Vous ne devez pas renvoyer * pour Allow-Origin. Voir stackoverflow.com/a/12014554
Karlas
@Karlas, veuillez d'abord lire la question avant de placer votre commentaire et de voter. La question n'a pas été posée pour "Allow-Origin", mais plutôt pour le gestionnaire des verbes http.
Santosh Prasad Sah
3
Je n'ai pas voté contre, juste un commentaire secondaire, au cas où quelqu'un copierait la solution.
Karlas
Merci! runAllManagedModulesForAllRequests = "true" est ce qui l'a fait pour moi.
Eddie Fletcher
8

J'ai eu ce problème et j'ai résolu ce qui suit:

  1. ouvrir IIS
  2. Sélectionnez le site backend

    entrez la description de l'image ici

  3. dans la vue des fonctionnalités: ouvrir le mappage des gestionnaires

entrez la description de l'image ici

  1. dans la fenêtre Mappage de gestionnaire, recherchez WebDAV

entrez la description de l'image ici

  1. dans Modifier le mappage de module, ouvrez les restrictions de demande

entrez la description de l'image ici

  1. entrez la description de l'image ici
BehrouzMoslem
la source
Sauvé ma vie. Merci
deanwilliammills
2
Cela n'a pas fonctionné. Il a cassé tout le site .Net CORE. Dû revenir.
Ravi Ram
4

Si aucune des solutions ci-dessus n'a résolu votre problème comme dans mon cas (toujours bloqué avec mon module RestClient face à 405), essayez de demander votre Api avec un outil comme Postman ou Fiddler. Je veux dire que le problème peut être ailleurs comme une demande mal formatée.

Je découvre que mon module RestClient demandait un 'Put' avec un paramètre Id pas bien formaté:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

au lieu de

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

Incidieusement, une demande mal formatée renvoie 405 - Méthode non autorisée (IIS 7.5)

Guillaume Raymond
la source
J'ai la même situation ici. Mais, dans mon cas, je dois passer un corps avec ma demande PUT. J'utilise Insomnia (comme Postman) comme client outil et cela fonctionne très bien. Mais pas sur mon code. Des idées?
Darós
3

Peu fréquent mais peut aider certains.

assurez-vous que vous utilisez [HttpPut] de System.Web.Http

Nous obtenions un 405 «Méthode non autorisée», sur une méthode décorrée HttpPut.

Notre problème semble rare, car nous avons accidentellement utilisé l' attribut [HttpPut] de System.Web.Mvc et non de System.Web.Http

La raison en est que resharper a suggéré la version .Mvc, où, comme d'habitude, System.Web.Http est déjà référencé lorsque vous dérivez directement d' ApiController, nous utilisions une classe qui étendait ApiController.

Nick Josevski
la source
1
Si vous utilisez l'API Web, vous ne décorez pas du tout les méthodes de contrôleur, mais utilisez le verbe dans le nom de la méthode.
niico
2

Cela s'est produit (méthode 405 non autorisée) lorsque la méthode de publication de l'API Web que j'appelais avait des types primitifs pour les paramètres, au lieu d'un type complexe accessible à partir du corps. Ainsi:

Cela a fonctionné:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

Cela n'a pas:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)
Tony
la source
1
Cela peut également se produire en cas de non-concordance entre le paramètre de la route et le nom de la variable dans la signature de la méthode (en d'autres termes, route = "/ api / person / {identity}" et method = "public void putPerson (int id) {...} ")
RonnBlack
2

Cette erreur vient du gestionnaire de fichiers statiques - qui par défaut ne filtre aucun verbe, mais ne peut probablement traiter que HEAD et GET.

Et c'est parce qu'aucun autre gestionnaire n'est venu à l'assiette et a dit qu'il pouvait gérer DELETE.

Puisque vous utilisez WEBAPI, qui en raison du routage n'a pas de fichiers et donc d'extensions, les ajouts suivants doivent être ajoutés à votre fichier web.config:

<system.webserver>
    <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="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" />

Évidemment, ce qui est nécessaire dépend du mode classique par rapport au mode intégré, et le mode classique dépend du bitness. De plus, l'en-tête OPTIONS a été ajouté pour le traitement CORS, mais si vous ne faites pas CORS, vous n'en avez pas besoin.

Pour info, votre web.config est la version locale de l'application (ou du répertoire d'application) dont le niveau supérieur est applicationHost.config.

Gérard ONeill
la source
1

S'il s'agit d'IIS 8.0, vérifiez si l'activation HTTP est activée. Gestionnaire de serveur -> IIS -> Gérer (voir en haut à droite) -> Ajouter des rôles et des fonctionnalités -> ... -> accéder à la configuration WCF, puis sélectionner Activation HTTP.

Narsi Venkat
la source
0

Dans notre cas, le problème était lié à la connexion fédérée entre un site .Net et ADFS. Lors de la redirection vers le point de terminaison ADFS le wctxparamètre nécessaire tous les trois paramètres pour la WSFederationAuthenticationModule.CreateSignInRequestméthode: rm, idetru

Merci à Guillaume Raymond pour l'astuce pour vérifier les paramètres d'URL!

renard dan
la source
0

Outre toutes les solutions ci-dessus, vérifiez si vous avez le " id" ou un paramètre personnalisé défini dans la DELETEméthode correspond à la configuration de la route.

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

Si vous rencontrez des erreurs 405 répétées, réinitialisez la signature de la méthode par défaut comme ci-dessus et essayez.

La configuration d'itinéraire par défaut recherchera iddans l'URL. Le nom du paramètre idest donc important ici à moins que vous ne changiez la configuration de la route sous le App_Startdossier.

Vous pouvez changer le type de données du idcependant.

Par exemple, la méthode ci-dessous devrait fonctionner correctement:

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

Remarque: assurez-vous également de transmettre les données sur l'URL et non sur la méthode de données qui transportera la charge utile en tant que contenu du corps.

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

Exemple:

DELETE http://localhost/item/1

J'espère que ça aide.

Arun
la source
0

J'ajouterai pour ceux qui se retrouvent bloqués en essayant de fonctionner PHP( Laraveldans certains cas) ou d'une autre IISsituation d'hébergement unique avec le 405 error, que vous devez changer verbsle gestionnaire pour cela pour cette situation spécifique ... donc depuis que j'utilisais, PHPje suis allé à le PHPgestionnaire et dans l' onglet, Request Restrictionspuis Verbs, ajoutez le dont verbsvous avez besoin. Ce fut tout ce que je besoin d'ajouter au web.configpour permettre CORSà Laravel.

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
Serj Sagan
la source
0

Rien de ce qui précède n'a fonctionné pour moi et j'ai résolu des problèmes en utilisant une page de support ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -qui-est-hébergé-sur-un-serveur) alors j'ai comparé le fichier hôte de l'application avec l'une des copies de travail et il semble qu'il me manquait un tas de gestionnaires et quand j'ai ajouté ceux-ci à l'hôte d'application, il a commencé à fonctionner. Il me manquait tout ça,

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
joie de sharon
la source