IT-Swarm.Net

Web-API - 405 - Die angeforderte Ressource unterstützt die http-Methode 'PUT' nicht.

Ich habe ein Web-API-Projekt und kann "PUT/Patch" -Anfragen dagegen nicht aktivieren.

Die Antwort, die ich von Fiddler bekomme, ist:


HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Allow: GET,POST,DELETE
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcZG90TmV0XFdlYkFQSVxBZFNlcnZpY2VcQWRTZXJ2aWNlXGFwaVxpbXByZXNzaW9uXDE1?=
X-Powered-By: ASP.NET
Date: Tue, 06 May 2014 14:10:35 GMT
Content-Length: 72

{"message":"The requested resource does not support http method 'PUT'."}

Basierend auf der obigen Antwort werden "PUT" Verben nicht akzeptiert. Ich kann jedoch nicht herausfinden, wo der zugehörige Handler konfiguriert ist.

Die "Put" -Methode der Klasse wird wie folgt deklariert:

[HttpPatch]
[HttpPut]
public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel)
{
     bla, bla, bla, bla
}

Ich habe die in den folgenden Threads erläuterten Änderungen gelesen und implementiert: - Asp.NET Web API - 405 - Das für den Zugriff auf diese Seite verwendete HTTP-Verb ist nicht zulässig - Festlegen von Handlerzuordnungen - http://www.asp.net/web-api/overview/testing-and-debugging/truffer-http-405-errors-after-publishing-web-api-anwendungen

Nichts hat funktioniert, da ich immer noch eine 405-Antwort bekomme, wenn ich einen "PUT" -Befehl für mein Web-API-Projekt ausgeben möchte.

Ich habe sogar alle "Handler" in der Datei ApplicationsHost.config auskommentiert.

Arbeiten mit VS2012 Premium und IIS Express (ich gehe davon aus, dass es sich um Version 8 handelt). Ich habe auch den VS Dev Server ausprobiert, aber das hat mir auch das gleiche Ergebnis gebracht.

Ich habe keine Ideen mehr. Jede Hilfe wäre dankbar.

Danke, Lee

18
LeeVDuhl

Verwenden Sie das Attribut-Routing?

Dieser mystische Fehler war ein Problem mit route attributes. Dies ist in Ihrem WebAPIConfig aktiviert als:

 config.MapHttpAttributeRoutes(); 

Es stellt sich heraus, dass Web-Api-Controller "keine Mischung aus verb-basierten Aktionsmethoden und herkömmlichem Routing von Aktionsnamen hosten können"; https://aspnetwebstack.codeplex.com/workitem/184

kurz gesagt: Ich musste alle meine Aktionen in meinem API-Controller mit dem Attribut [Route] kennzeichnen. Andernfalls wird die Aktion "ausgeblendet" (405), wenn versucht wird, sie durch herkömmliches Routing zu finden.

API-Controller:

[RoutePrefix("api/quotes")]
public class QuotesController : ApiController
{
    ...

    // POST api/Quote
    [ResponseType(typeof(Quote))]
    [Route]
    public IHttpActionResult PostQuote(Quote quote)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Quotes.Add(quote);
        db.SaveChanges();

        return CreatedAtRoute("", new { id = quote.QuoteId }, quote);
    }

Hinweis: Meine Route ist nicht benannt, der Name CreatedAtRoute () ist nur eine leere Zeichenfolge.

WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

        // Web API routes
        config.MapHttpAttributeRoutes();

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

    }
}

hoffe das hilft 

22
proggrock

Ich hatte genau das gleiche Problem wie Sie und habe alle Dinge ausprobiert, die Sie ausprobiert haben, aber manchmal ist die Lösung so trivial und unter Ihrer Nase, dass Sie es nicht erwarten und nach komplizierteren Gründen suchen. Stellen Sie sicher, dass Sie in der URL zum Testen Ihrer Webmethoden die Namen der Parameter mit den Namen in der Controller-Methodendeklaration übereinstimmen. Mein 405-Problem wurde gelöst, indem einfach Folgendes ausgeführt wurde (ich verwendete Abfrageparameter):

Mein KundenController:

...

[HttpPut]
public string PutClient(string username = "", string phone= ""){...}

In meiner WebApiConfig:

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}"
);

Der Pfad, der zum Testen der Methode verwendet wird, muss wie folgt aussehen: (Verwenden Sie Postman oder ähnliches, um die richtige Webmethode anzuwenden.)

http://localhost:49216/api/clients?username=Kurt&phone=443332211

Andernfalls erhalten Sie eine 405 für diese http-Methode in diesem Controller. Ich musste die web.config überhaupt nicht ändern (keine Notwendigkeit, webdav zu entfernen, etc ..). Überprüfen Sie this nach Quelle in der Dokumentation: 

Betrachten Sie zum Beispiel die folgende Aktion:

public void Get (int id) 

Der id-Parameter bindet an den URI. Deshalb, Diese Aktion kann nur mit einem URI übereinstimmen, der einen Wert für "id" .__ enthält. entweder im Routenwörterbuch oder in der Abfragezeichenfolge.

Optionale Parameter stellen eine Ausnahme dar, da sie optional sind. Zum Ein optionaler Parameter ist OK, wenn die Bindung den Wert nicht von .__ abrufen kann. die URI.

8
kurt

Dies ist mir passiert, als ich den ersten Parameternamen der PUT-Methode geändert habe

public void Put(int code, [FromBody]Lead lead)

Es sollte sein:

public void Put(int id, [FromBody]Lead lead)

Und so wird es genannt:

$.ajax({
    type: "PUT",
    data: json,
    url: "../api/leadsapi/123",
    contentType: "application/json; charset=utf-8"
});
2
Daniel Cardenas

Diese Antwort hat das Problem für mich behoben. Ich musste das Route-Attribut hinzufügen und das Problem wurde gelöst. 

    [HttpPut]
    [Route("")]
    public HttpResponseMessage MyMethod()
1
Dave Storm

hatte das gleiche Problem, ich musste 3 Dinge tun, um das zu lösen:

  1. deaktiviere Webdav in <modules> und <handlers>
  2. Stellen Sie sicher, dass HttpPut von System.Web.Http und nicht von System.Web.Mvc stammt, wenn Sie WebAPI verwenden
  3. aktivieren Sie ExtensionlessUrlHandler wie folgt

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

Ich hoffe, das kann einigen von Ihnen helfen, dieses unangenehme Problem zu lösen ...

1
Ben Croughs

Dies ist auch die Fehlermeldung, die zurückgegeben wird, wenn Sie vergessen, die Put () -Methode auf Ihrem API-Controller öffentlich zu machen. Was im Nachhinein offensichtlich ist, verursachte aber gute zehn Minuten Kopfzerkratzen.

1
Dylan Beattie

Fügen Sie im Abschnitt "Handler" in der Datei "web.config" den folgenden Abschnitt hinzu:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Zum Beispiel:

<handlers>
    <remove name="WebDAV" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="OPTIONSVerbHandler" />
    <remove name="TRACEVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
0
Sulabh Singla

Für mich war es, wie viele der anderen Plakate behauptet hatten. Wahrscheinlich haben Sie in Ihrer webapiconfig alles richtig eingerichtet, aber Ihnen fehlt nur etwas Dummes.

In meinem Fall hatte ich eine Route definiert als:

[HttpPut]
    [Route("api/MilestonePut/{Milestone_ID}")]
    public void Put(int id, [FromBody]Milestone milestone)
    {
        db.Entry(milestone).State = System.Data.Entity.EntityState.Modified;
        db.SaveChanges();
    }

Sehen Sie das Problem? Der Parameter ist in der Route als Milestone_ID definiert, in der Funktion selbst jedoch als id. Sie würden denken, .NET wäre schlau genug, um dies zu realisieren, aber es funktioniert definitiv nicht und wird auch nicht funktionieren.

Sobald ich es so geändert habe, dass es mit dem Parameter übereinstimmt:

[HttpPut]
    [Route("api/MilestonePut/{id}")]
    public void Put(int id, [FromBody]Milestone milestone)
    {
        db.Entry(milestone).State = System.Data.Entity.EntityState.Modified;
        db.SaveChanges();
    }

alles funktionierte wie ein Zauber.

0
Indy-Jones

Vielleicht ist es jetzt spät, aber jemand kann das nutzen.

Ich wollte die PUT-Anfrage verwenden und habe gerade ein stringified-Objekt an die Web-API gesendet, und die Einfügemethode akzeptierte nur dieses Objekt.

JQUERY

let musterija = {
            Name: name,
            Email: email,
            Password: password,
            Username: logUser.Username,
            Lastname: lastname,
            GenderString: gender,
            Jmbg: identification,
            PhoneNumber: phone,
        };

        $.ajax({
            method: "PUT",
            url: "/api/Musterija",
            data: JSON.stringify(musterija),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function () {
                alert("Entity updated");
                EmptyAllInputs();
                $('#divprofile').show();
                $('#divupdate').hide();
            },
            error: function (msg) {
                alert("Fail - " + msg.responseText);
            }
        });

WEB API

    [HttpPut]
    public HttpResponseMessage PutMusterija(Musterija m)
0
Serlok

Sie sollten es in Ihrer Webserver-Konfiguration konfigurieren. Es hängt von der Art des Webservers ab, wo Sie dies tun können. Zum Beispiel können Sie mithilfe von IIS eine Datei web.config verwenden, um dies in Ihrem Dokumentstammverzeichnis zu tun. Bei Cross-Origin-Anforderungen müssen Sie der Antwort CORS-Header hinzufügen, um Herkunft, Methoden usw. zuzulassen.

note: Wahrscheinlich können Sie auch mit dem ASP.NET-Framework etwas dagegen tun, aber ich denke, es ist anders.

0
inf3rno