WebAPI supprimer ne fonctionne pas - la méthode 405 N'est pas autorisée

j'apprécie toute l'aide sur ce que le site est censé aller en direct ce soir!

j'ai un contrôleur d'api web avec une méthode de suppression. La méthode s'exécute très bien sur ma machine locale qui exécute IIS Express (Windows 8) mais dès que je l'ai déployé sur le serveur IIS en direct (Windows Server 2008 R2) il a cessé de fonctionner et lance le message d'erreur suivant:

erreur HTTP 405.0-méthode non autorisée La page que vous recherchez ne peut pas être affiché parce qu'une méthode non valide (HTTP Verb) est utilisée

j'ai cherché des solutions sur le web et j'en ai implémenté 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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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 changer les mappages du gestionnaire et le filtrage de la demande 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écier Grâce.

97
demandé sur Konrad Kokosa 2013-03-25 19:47:43

12 réponses

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

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

j'espère que cette aide

166
répondu Chris 2013-12-20 20:37:29

dans certains cas, le supprimer juste des modules peut produire la prochaine erreur:

500.21 Handler "WebDAV" a un mauvais module "WebDAVModule" dans sa liste de modules

Module: IIS Web Core Notification: ExecuteRequestHandler "

la solution a été suggéré ici . Il faut aussi le retirer des manipulateurs.

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
46
répondu aleha 2017-05-23 12:02:56

Dans mon cas, aucune des solutions ci-dessus. C'était parce que j'avais changé le nom du paramètre dans ma méthode Delete .

j'avais

public void Delete(string Questionid)

au lieu de

public void Delete(string id)

je dois utiliser le nom id parce que c'est le nom qui est 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 .

28
répondu Hugo Nava Kopp 2017-06-19 10:38:19

le Javascript pour HTTP DELETE verbe 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;
    }
});

Faire pas utiliser quelque chose comme ceci:

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

comme lorsque vous utilisez la méthode POST .

12
répondu Pavel Kharibin 2016-05-23 21:18:01

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

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

dans web.fichier de configuration résolu mon problème. C'est comme ça que 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
répondu Aamir 2015-05-20 02:45:01

passez à applicationHost.config (habituellement sous C:\Windows\System32\inetsrv\config) déposer et commenter la ligne suivante dans applicationHost.config

1) sous :

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

2)commentez également le module suivant étant référé par le gestionnaire ci-dessus sous < modules>

<add name="WebDAVModule" />
1
répondu arviman 2016-01-08 11:59:16

j'ai eu la méthode d'erreur 405 non autorisée parce que j'avais omis de rendre publique la méthode de suppression sur le contrôleur WebApi.

il m'a fallu beaucoup de temps pour le trouver (trop longtemps!) parce que je m'attendais à une erreur non trouvée dans ce cas, donc je supposais à tort que ma méthode de suppression était refusée.

la raison pour laquelle je ne suis pas autorisé plutôt que pas trouvé est que j'ai aussi eu une méthode Get pour la même route (qui sera le cas normal lors de la mise en œuvre de REST). La fonction "public Get" est associée au routage, puis rejetée à cause de la mauvaise méthode http.

une simple erreur que je connais mais qui peut sauver quelqu'un d'autre un certain temps.

1
répondu Paul D 2016-03-24 12:19:18

Juste à ajouter. Si c'est votre configuration

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

s'il vous plaît continuer à faire comme Hugo l'a dit, et ne pas définir l'Itinéraire de l'attribut pour le contrôleur de la méthode get, ce qui a donné un problème dans mon cas.

1
répondu user6247020 2016-04-24 09:42:27

après avoir essayé presque toutes les solutions ici cela a fonctionné pour moi. Ajoutez ceci dans votre fichier de configuration APIs

<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>
1
répondu Nithin Chandran 2017-12-20 13:51:53
L'attribut

[HttpPost] sur le dessus de la méthode Delete a résolu ce problème pour moi:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}
0
répondu Andriy Gubal 2015-01-26 07:54:57

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 string par défaut pour l'id. ajouter {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
répondu Hath 2016-06-20 12:24:35

nous avons dû ajouter des en-têtes personnalisés à notre web.config as notre requête avait plusieurs en-têtes qui ont embrouillé 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
répondu Zadok 2017-03-31 20:47:40