wake-up-neo.net

405 methode nicht erlaubt web api

Dieser Fehler ist sehr häufig, und ich habe alle Lösungen ausprobiert, und keine davon hat funktioniert. Ich habe die WebDAV-Veröffentlichung in der Systemsteuerung deaktiviert und dies zu meiner Web-Konfigurationsdatei hinzugefügt:

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

Der Fehler bleibt bestehen. Dies ist der Controller:

   static readonly IProductRepository repository = new ProductRepository();

    public Product Put(Product p)
    {
        return repository.Add(p);
    }

Methodenimplementierung:

 public Product Add(Product item)
    {
        if (item == null)
        {
            throw new ArgumentNullException("item");
        }
        item.Id = _nextId++;
        products.Add(item);
        return item;
    }

Und hier wird die Ausnahme ausgelöst:

client.BaseAddress = new Uri("http://localhost:5106/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));      
var response = await client.PostAsJsonAsync("api/products", product);//405 exception

Irgendwelche Vorschläge?

74
Xardas

Du postest vom Kunden:

await client.PostAsJsonAsync("api/products", product);

nicht PUTing. 

Ihre Web-API-Methode akzeptiert nur PUT-Anforderungen.

So:

await client.PutAsJsonAsync("api/products", product);
48
Darin Dimitrov

Ich hatte die gleiche Ausnahme. Mein Problem war, dass ich verwendet hatte:

using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}

SOLLTE SEIN

using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!!
[HttpGet]
public string Blah()
{
    return "blah";
}
55
Llad

Ich habe viele Dinge ausprobiert, um die DELETE-Methode zum Laufen zu bringen (ich bekam 405 Methode, Web-API nicht erlaubt), und schließlich fügte ich [Route ("/ API/Scan/{id}")] zu meinem Controller hinzu und funktionierte gut . Ich hoffe, dieser Beitrag hilft jemandem.

     // DELETE api/Scan/5
    [Route("api/scan/{id}")]
    [ResponseType(typeof(Scan))]
    public IHttpActionResult DeleteScan(int id)
    {
        Scan scan = db.Scans.Find(id);
        if (scan == null)
        {
            return NotFound();
        }

        db.Scans.Remove(scan);
        db.SaveChanges();

        return Ok(scan);
    }
17
user2662006

Mein Problem erwies sich als Attribut-Routing in WebAPI. Ich habe eine benutzerdefinierte Route erstellt und diese wurde wie ein GET behandelt, anstatt dass WebAPI herausfand, dass es ein POST war

    [Route("")]
    [HttpPost] //I added this attribute explicitly, and it worked
    public void Post(ProductModel data)
    {
        ...
    }

Ich wusste, dass es etwas Dummes sein musste (das verbraucht den ganzen Tag)

10
Nexxas

Hier ist eine Lösung 

<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>

docs.Microsoft.com - Lösungsartikel

und entfernen Sie WebDAV aus Modulen

<remove name="WebDAVModule" />

Wenn Sie eine Route haben

[Route("nuclearreactors/{reactorId}")]

Sie müssen exakt denselben Parameternamen in der Methode verwenden, z. 

public ReactorModel GetReactor(reactorId)
{
 ...
}

Wenn Sie nicht exakt denselben Parameter übergeben, wird möglicherweise der Fehler "405-Methode nicht zulässig" angezeigt, da die Route nicht mit der Anforderung übereinstimmt und WebApi eine andere Controller-Methode mit einer anderen zulässigen HTTP-Methode ausführt.

4
roylac

Ich erhielt den 405 bei meinem GET-Aufruf, und es stellte sich heraus, dass ich den Parameter in der serverseitigen GET-Methode Get(int formId) benannte und die Route ändern oder Get(int id) umbenennen musste.

4
Sako73

Chrome versucht oft, einen OPTIONS-Aufruf durchzuführen, bevor er einen Beitrag erstellt. Dadurch wird sichergestellt, dass die CORS-Header in Ordnung sind. Es kann problematisch sein, wenn Sie den Aufruf OPTIONS in Ihrem API-Controller nicht verarbeiten.

public void Options() { }
4
Nate Zaugg

Sie können den Fehler 405 auch erhalten, wenn Sie sagen, dass Ihre Methode einen Parameter erwartet und Sie ihn nicht übergeben.

Das funktioniert NICHT (405 Fehler)

HTML-Ansicht/Javascript

$.ajax({
         url: '/api/News',
         //.....

Web-API:

public HttpResponseMessage GetNews(int id)

Wenn also die Methodensignatur wie oben ist, müssen Sie Folgendes tun:

HTML-Ansicht/Javascript

$.ajax({
         url: '/api/News/5',
         //.....
4
Tom Stickel

Ich bin spät dran bei dieser Party, aber da oben nichts machbar war oder in den meisten Fällen funktionierte, wurde dies für mich endgültig gelöst.

Auf dem Server, auf dem die Site/der Dienst gehostet wurde, war eine Funktion erforderlich! HTTP AKTIVIERUNG !!!

Server-Manager> Verwalten> Rollen und Features hinzufügen> next next next, bis Features> Under .NET (für jede Version) angezeigt wird, und klicken Sie auf HTTP-Aktivierung . Beachten Sie auch, dass unter "net> WCF Services" eine versteckt ist.

Das hat dann sofort funktioniert! .__ Das hat mein Gehirn zum Schmelzen gebracht

3
Monolithcode

Dieser Fehler kann auch auftreten, wenn Sie versuchen, eine Verbindung zu http herzustellen, während sich der Server auf https befindet. 

Es war etwas verwirrend, da meine Get-Requests in Ordnung waren. Das Problem war nur bei Post-Requests vorhanden. 

3
FrankyHollywood

Ich könnte das NICHT lösen. Ich hatte CORS aktiviert und arbeitete solange, bis POST void (ASP.NET 4.0 - WEBAPI 1) zurückgegeben wurde. Als ich versuchte, eine HttpResponseMessage zurückzugeben, erhielt ich die HTTP 405-Antwort.

Aufgrund von Llads Antwort oben habe ich mir meine eigenen Referenzen angesehen. 

Ich hatte das Attribut [System.Web.Mvc.HttpPost] oberhalb meiner Methode POST. 

Ich habe dies geändert, um zu verwenden: 

[System.Web.Http.HttpPostAttribute]
[HttpOptions]
public HttpResponseMessage Post(object json)        
{
    ...
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}

Das hat meine Leiden behoben. Ich hoffe das hilft jemand anderem. 

Der Vollständigkeit halber hatte ich in meiner web.config folgendes: 

<httpProtocol>
    <customHeaders>
        <clear />
        <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
        <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
        <remove name="X-Powered-By" />
    </customHeaders>
</httpProtocol>
2

Dies beantwortet Ihre spezifische Frage nicht, aber als ich das gleiche Problem hatte, war ich hier und ich dachte, dass mehr Leute dasselbe tun könnten.

Das Problem, das ich hatte, war, dass ich meine Get-Methode unabsichtlich als static deklariert hatte. Ich habe dies einen ganzen Vormittag verpasst und es gab keine Warnungen vor Attributen oder ähnlichem.

Falsch:

public class EchoController : ApiController
{
    public static string Get()
    {
        return string.Empty;
    }
}

Richtig:

public class EchoController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }
}
2
Per Stolpe

[HttpPost] ist nicht notwendig!

[Route("")]
public void Post(ProductModel data)
{
    ...
}
1
user3963793

Ein anderes mögliches Problem, das dasselbe Verhalten verursacht, sind die Standardparameter im Routing. In meinem Fall wurde der Controller korrekt lokalisiert und instanziiert, aber POST wurde aufgrund der angegebenen Standardaktion Get blockiert:

config.Routes.MapHttpRoute(
    name: "GetAllRoute",
    routeTemplate: "api/{controller}.{ext}"/*,
    defaults: new { action = "Get" }*/ // this was causing the issue
);
0
Eadel

Ich hatte genau das gleiche Problem. Ich habe zwei Stunden lang nach etwas Falschem gesucht, bis ich feststellte, dass meine POST-Methode private anstelle von public war. 

Es ist schon komisch zu sehen, dass diese Fehlermeldung generisch ist. Ich hoffe es hilft!

0
Gonzo345

Wir hatten ein ähnliches Problem. Wir haben versucht zu bekommen von:

[RoutePrefix("api/car")]
public class CarController: ApiController{

    [HTTPGet]
    [Route("")]
    public virtual async Task<ActionResult> GetAll(){

    }

}

Also würden wir .GET("/api/car") und dies würde einen 405 error werfen.


Die Reparatur:

Die Datei CarController.cs befand sich im Verzeichnis /api/car. Wenn wir also diesen Endpunkt für die APIs anforderten, gab IIS einen Fehler zurück, da es so aussah, als würden wir versuchen, auf ein virtuelles Verzeichnis zuzugreifen, das uns nicht erlaubt war. 

Option 1: change/umbenennen das Verzeichnis, in dem sich der Controller befindet
Option 2: Ändern Sie das Routenpräfix in etwas, das nicht mit dem virtuellen Verzeichnis übereinstimmt.

0
Zze

In meinem Fall hatte ich einen physischen Ordner im Projekt mit demselben Namen wie die WebAPI-Route (z. B. Sandbox) und nur die Anforderung POST wurde vom Handler für statische Dateien in IIS abgefangen. (offensichtlich).

Es hat lange gedauert, bis ich einen irreführenden Fehler 405 anstelle des erwarteten Fehlers 404 erhalten habe.

Es ist nicht leicht, darauf hereinzufallen, aber möglich. Hoffe es hilft jemandem.

0
Panos Roditakis

checken Sie Ihre Projekt-.csproj-Datei ein und ändern Sie sie 

<IISUrl>http://localhost:PORT/</IISUrl>

auf Ihre Website-URL wie folgt

<IISUrl>http://example.com:applicationName/</IISUrl>
0
Ankit