it-swarm.com.de

WebAPI-Löschen funktioniert nicht - 405 Methode nicht zulässig

Ich freue mich über jede Hilfe, da die Website heute Abend live gehen soll!

Ich habe einen Web-API-Controller mit einer Delete-Methode. Die Methode wird auf meinem lokalen Computer, auf dem IIS Express (Windows 8) ausgeführt wird, einwandfrei ausgeführt. Sobald ich sie jedoch auf dem Live-Server IIS (Windows Server 2008 R2) bereitstellt, funktioniert sie nicht mehr und die folgende Fehlermeldung wird angezeigt :

HTTP-Fehler 405.0 - Methode nicht zulässig .__ Die von Ihnen gesuchte Seite kann nicht angezeigt werden, da eine ungültige Methode (HTTP-Verb) verwendet wird

Ich habe mich im Web nach Lösungen umgesehen und die sinnvollsten umgesetzt. Meine Web-Konfiguration hat folgende Einstellungen:

<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>

Ich habe auch versucht, die Handler-Zuordnungen und die Anforderungsfilterung in IIS ohne Erfolg zu ändern. Beachten Sie, dass die WebDAV-Authoring-Regeln in IIS deaktiviert zu sein scheinen.

Alle Ideen werden sehr geschätzt. Vielen Dank.

104
Chris

Ich habe die Lösung letztendlich gefunden! Wenn Sie auf dasselbe Problem stoßen, fügen Sie Ihrer web.config Folgendes hinzu:

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

Ich hoffe das hilft

176
Chris

In einigen Fällen kann das Entfernen nur von Modulen zu einem nächsten Fehler führen: 

500.21 Handler "WebDAV" hat ein fehlerhaftes Modul "WebDAVModule" in seiner Modulliste

Modul: IIS Web Core-Benachrichtigung: ExecuteRequestHandler "

lösung wurde vorgeschlagen hier . Sie müssen es auch von Handlern entfernen. 

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

In meinem Fall funktionierte keine der oben genannten Lösungen. Dies lag daran, dass ich den Namen des Parameters geändert in meiner Delete-Methode hatte. 

Ich hatte

public void Delete(string Questionid)

anstatt 

public void Delete(string id)

Ich muss den id-Namen verwenden, da dies der Name ist, der in meiner WebApiConfig-Datei angegeben ist. Beachten Sie den id-Namen in der dritten und vierten Zeile:

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

Ich habe diese Lösung von hier bekommen.

30
Hugo Nava Kopp

Das Javascript für HTTP DELETE Verb muss folgendermaßen aussehen:

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

Verwenden Sie not so etwas:

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

b. wenn Sie die POST-Methode verwenden.

12
Pavel Kharibin

Ich hatte auch das gleiche Problem, ich rufe WebAPi auf und erhalte diesen Fehler. Das Hinzufügen der folgenden Konfiguration in web.config für Dienste hat mein Problem gelöst

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

in der Datei web.config wurde mein Problem gelöst 

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

Wechseln Sie zur Datei applicationHost.config (normalerweise unter C:\Windows\System32\inetsrv\config) und kommentieren Sie die folgende Zeile in applicationHost.config aus

1) Unter <Handler>:

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

2) Kommentieren Sie auch das folgende Modul aus, das vom obigen Handler unter <modules> referenziert wird

<add name="WebDAVModule" />
2
arviman

Nachdem ich fast alle Lösungen ausprobiert hatte, funktionierte das für mich

<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

Einfach nur hinzufügen. Wenn das deine Konfig ist

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

bitte machen Sie weiter, wie Hugo sagte, und setzen Sie das Route-Attribut nicht auf die Controller-Methode "get". Dies gab in meinem Fall ein Problem.

1
user6247020

Ich hatte eine 405-Fehlermethode, die nicht zulässig war, da ich die Löschmethode auf dem WebApi-Controller nicht öffentlich gemacht hatte.

Ich habe lange gebraucht, um das zu finden (zu lange!), Weil ich in diesem Fall einen Fehler nicht gefunden erwartet hätte, und ich habe fälschlicherweise angenommen, dass meine Delete-Methode abgelehnt wurde.

Der Grund für Nicht erlaubt und nicht gefunden ist, dass ich auch eine Get-Methode für dieselbe Route hatte (was bei der Implementierung von REST der Normalfall ist). Die öffentliche Get-Funktion wird vom Routing abgeglichen und aufgrund der falschen http-Methode abgelehnt.

Ein einfacher Fehler, den ich kenne, aber er kann jemandem etwas Zeit sparen.

1
Paul D

In meinem Fall habe ich es versäumt, {id} zur [Route("")] hinzuzufügen, und ich habe den gleichen Fehler erhalten. Das Hinzufügen hat das Problem für mich behoben: [Route("{id}")]

1
Reza

Wir mussten unserer web.config benutzerdefinierte Header hinzufügen, da unsere Anfrage mehrere Header hatte, die die API-Antwort verwirrten.

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

Das Attribut [HttpPost] oben in der Delete-Methode hat dieses Problem für mich gelöst:

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

Ich hatte das ähnliche Problem, aber für PUT - keiner der anderen Vorschläge hat für mich funktioniert. 

Allerdings verwendete ich int anstelle der Standardeinstellung string für die ID. das Hinzufügen von {id:int} zur Route löste mein Problem.

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