web-dev-qa-db-fra.com

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

J'ai écrit le service REST utilisant l’API Web ASP.NET . Je tente 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 IIS la gestion à distance, aller à la section Mappages de 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 ... (comme ici: http://www.somacon.com/p126.php ).

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

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

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

Salutations

85
Bart

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

24
Darin Dimitrov

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

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
302
giacomelli

Changez 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>
16
Hithesh

Modifiez votre fichier Web.Config comme indiqué ci-dessous. Cela agira comme un charme.

Dans le noeud <system.webServer>, ajoutez la partie de code ci-dessous.

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

Après l'ajout, votre Web.Config ressemblera à celui 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>
14

J'ai eu ce problème et j'ai résolu le problème suivant:

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

     enter image description here 

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

 enter image description here 

  1. dans la fenêtre Handler Mapping, Find WebDAV

 enter image description here 

  1. dans Edit Module Mapping, ouvrez Request Restrictions

 enter image description here 

  1.  enter image description here 
4
BehrouzMoslem

Si aucune des solutions ci-dessus ne résout votre problème comme dans mon cas (toujours bloqué avec mon module RestClient faisant face au 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 requête mal formatée. 

Je découvre que mon module RestClient demandait un "Put" avec un identificateur de code non 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 formatée incorrecte renvoie 405 - Méthode non autorisée (IIS 7.5) 

4
Guillaume RAYMOND

Peu commun mais peut aider certains.

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

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

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

Resharper a suggéré la version .Mvc, où System-Web.Http est généralement déjà référencé lorsque vous dérivez directement de ApiController nous utilisions une classe qui étendait ApiController.

3
Nick Josevski

Cette erreur provient du gestionnaire staticfile - qui par défaut ne filtre pas les verbes, mais ne peut probablement traiter que de HEAD et de GET.

Et c’est parce qu’aucun autre manipulateur n’a pris la parole pour dire qu’ils pouvaient 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 nombre de bits. De plus, l'en-tête OPTIONS a été ajouté pour le traitement CORS, mais si vous ne le faites pas, vous n'en aurez pas besoin.

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

2
Gerard ONeill

Cela s'est produit (méthode 405 non autorisée) lorsque la méthode de publication Web api 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)
2
Tony Anderson

S'il s'agit de 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.

1
Narsi Venkat

J'ajouterai pour ceux qui sont coincés en essayant d'exécuter PHP (Laravel dans certains cas) ou une autre situation d'hébergement IIS unique avec le 405 error, que vous devez changer le verbs dans le gestionnaire pour cette situation spécifique ... donc depuis que je J'utilisais PHP Je suis allé dans le gestionnaire PHP et dans l'onglet Request Restrictions, puis Verbs, ajoutez la verbs dont vous avez besoin. C’est tout ce que j’avais besoin d’ajouter au web.config pour activer CORS dans 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>
0
Serj Sagan

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

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

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

La configuration de route par défaut recherchera id dans l'URL. Par conséquent, le nom du paramètre id est important à moins que vous ne modifiiez la configuration de la route dans le dossier App_Start.

Vous pouvez cependant changer le type de données de la id.

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

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

Remarque: Assurez-vous également que vous transmettez les données via l'url pas la méthode de données qui acheminera la charge utile sous forme de contenu corps.

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

Exemple:

DELETE http://localhost/item/1

J'espère que ça aide.

0
Arun

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 noeud final ADFS, le paramètre wctx avait besoin des trois paramètres de la méthode WSFederationAuthenticationModule.CreateSignInRequest: rm, id et ru

Merci à Guillaume Raymond pour le conseil de vérifier les paramètres d'URL!

0
dan fox