web-dev-qa-db-fra.com

La suppression WebAPI ne fonctionne pas - Méthode 405 non autorisée

J'apprécie votre aide, car le site est censé être mis en ligne ce soir!

J'ai un contrôleur d'api Web avec une méthode de suppression. La méthode s'exécute correctement sur ma machine locale exécutant IIS Express (Windows 8), mais dès que je l'ai déployée sur le serveur live IIS (Windows Server 2008 R2), elle a cessé de fonctionner et génère le message d'erreur suivant. :

Erreur HTTP 405.0 - Méthode non autorisée La page que vous recherchez ne peut pas être affichée car une méthode non valide (verbe HTTP) est utilisée

J'ai parcouru le Web pour trouver des solutions et j'ai mis en œuvre les solutions les plus raisonnables. Ma configuration Web a les paramètres suivants:

<system.webServer>
    <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,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

J'ai également essayé de modifier les mappages de gestionnaires et le filtrage des demandes dans IIS en vain. Veuillez noter que les règles de création WebDAV dans IIS semblent être désactivées.

Toutes les idées seront grandement appréciées Merci.

104
Chris

J'ai finalement trouvé la solution! Si vous rencontrez le même problème, ajoutez ce qui suit à votre fichier web.config

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

J'espère que ça aide

176
Chris

Dans certains cas, le supprimer simplement des modules peut générer l'erreur suivante: 

500.21 Le gestionnaire "WebDAV" a un mauvais module "WebDAVModule" dans sa liste de modules.

Module: IIS Notification Web Core: ExecuteRequestHandler "

la solution a été suggérée ici . Aussi besoin de l'enlever des gestionnaires. 

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
52
aleha

Dans mon cas, aucune des solutions ci-dessus ne fonctionnait. En effet, j'avais changé le nom du paramètre dans ma méthode Delete

J'ai eu

public void Delete(string Questionid)

au lieu de 

public void Delete(string id)

Je dois utiliser le nom id car c'est le nom déclaré dans mon fichier WebApiConfig. Notez le nom id aux troisième et quatrième lignes:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

J'ai eu cette solution de ici .

30
Hugo Nava Kopp

Le verbe Javascript pour HTTP DELETE doit être comme ceci:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

Est-ce que not utilise quelque chose comme ceci:

...
data: {id:id}
...

comme lorsque vous utilisez la méthode POST.

12
Pavel Kharibin

J'ai aussi eu le même problème, j'appelle WebAPi et je reçois cette erreur. Ajouter la configuration suivante dans web.config pour les services a résolu mon problème

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

dans le fichier web.config a résolu mon problème . Voici comment j’appelais du côté client 

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}
3
Aamir

Accédez au fichier applicationHost.config (généralement sous le fichier C:\Windows\System32\inetsrv\config) et mettez en commentaire la ligne suivante dans applicationHost.config.

1) Sous <gestionnaires>:

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2) Mettez également en commentaire le module suivant référé par le gestionnaire ci-dessus sous <modules>

<add name="WebDAVModule" />
2
arviman

Après avoir essayé presque toutes les solutions ici, cela a fonctionné pour moi . Ajoutez ceci dans le fichier de configuration de vos API

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>
2
Nithin Chandran

Juste pour ajouter. Si c'est votre config

config.Routes.MapHttpRoute (
 name: "DefaultApi", 
 routeTemplate: "api/{controller}/{id}", 
 defaults: new {id = RouteParameter.Optional}

continuez comme indiqué par Hugo, et ne définissez pas l'attribut Route sur la méthode get controller, cela a posé un problème dans mon cas.

1
user6247020

J'ai eu une erreur 405 Method Not Allowed parce que j'avais omis de rendre publique la méthode Delete sur le contrôleur WebApi.

Il m'a fallu beaucoup de temps pour trouver cela (trop longtemps!), Car je m'attendais à une erreur Introuvable dans ce cas. J'avais donc tort de supposer que ma méthode Delete était refusée.

La raison de non autorisé plutôt que de non trouvé est que j'avais également une méthode Get pour le même itinéraire (ce qui sera le cas normal lors de l'implémentation de REST). La fonction Get publique correspond au routage, puis est refusée à cause d'une mauvaise méthode http.

Une simple erreur que je connais mais qui peut sauver du temps à quelqu'un d'autre.

1
Paul D

Dans mon cas, j'ai manqué d'ajouter {id} à la [Route("")] et j'ai eu la même erreur. Ajouter cela a résolu le problème pour moi: [Route("{id}")]

1
Reza

Nous avons dû ajouter des en-têtes personnalisés à notre Web.config, car notre requête comportait plusieurs en-têtes qui confondaient la réponse de l'API.

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>
0
Zadok

L'attribut [HttpPost] en haut de la méthode Delete a résolu ce problème pour moi:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}
0
Andriy Gubal

J'ai eu le même problème, mais pour PUT - aucune des autres suggestions n'a fonctionné pour moi. 

Cependant, j'utilisais int plutôt que la valeur par défaut string pour l'identifiant. l'ajout de {id:int} à la route a résolu mon problème.

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }
0
Hath