102 votes

405 méthode non autorisée Web API

Cette erreur est très courante. J'ai essayé toutes les solutions et aucune n'a fonctionné. J'ai désactivé la publication WebDAV dans le panneau de configuration et ajouté ceci à mon fichier de configuration Web :

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

L'erreur persiste. Voici le contrôleur :

   static readonly IProductRepository repository = new ProductRepository();

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

Mise en œuvre de la méthode :

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

Et c'est là que l'exception est lancée :

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

Des suggestions ?

75voto

Darin Dimitrov Points 528142

Vous postez depuis le client :

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

et non pas le PUTing.

Votre méthode d'API Web n'accepte que les demandes PUT.

Donc :

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

64voto

Llad Points 649

J'ai eu la même exception. Mon problème était que j'avais utilisé :

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

DEVRAIT ÊTRE

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

18voto

user2662006 Points 1405

J'ai essayé plusieurs choses pour faire fonctionner la méthode DELETE (j'obtenais 405 method not allowed web api) , et finalement j'ai ajouté [Route("api/scan/{id}")] à mon contrôleur et tout fonctionne bien. J'espère que ce message aidera quelqu'un.

     // 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);
    }

17voto

Nexxas Points 146

Mon problème s'est avéré être le routage des attributs dans l'interface WebAPI. J'ai créé une route personnalisée, qui a été traitée comme un GET, alors que l'interface WebAPI avait découvert qu'il s'agissait d'un POST.

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

Je savais que ça devait être quelque chose de stupide (qui occupe toute la journée).

6voto

Nate Zaugg Points 1969

Chrome essaie souvent de faire un OPTIONS avant de faire un post. Il le fait pour s'assurer que les en-têtes CORS sont en ordre. Cela peut poser des problèmes si vous ne gérez pas l'en-tête OPTIONS dans votre contrôleur d'API.

public void Options() { }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X