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 ?

3voto

Per Stolpe Points 192

Cela ne répond pas à votre question spécifique, mais lorsque j'ai eu le même problème, j'ai atterri ici et je me suis dit que d'autres personnes pourraient faire de même.

Le problème que j'ai rencontré est que j'ai délibérément déclaré ma méthode Get en tant que statique . J'ai manqué cela pendant toute une après-midi, et cela n'a provoqué aucun avertissement des attributs ou autres.

C'est faux :

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

Correct :

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

3voto

Voici une solution :

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

article solution docs.microsoft.com

et supprimer WebDAV des modules

<remove name="WebDAVModule" />

2voto

user3963793 Points 31

[HttpPost] est inutile !

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

2voto

Spencer Sullivan Points 182

Je n'ai PAS pu résoudre ce problème. J'avais activé CORS et cela fonctionnait tant que le POST retournait void (ASP.NET 4.0 - WEBAPI 1). Lorsque j'ai essayé de renvoyer un HttpResponseMessage, j'ai commencé à obtenir la réponse HTTP 405.

Sur la base de la réponse de Llad ci-dessus, j'ai jeté un coup d'œil à mes propres références.

L'attribut [System.Web.Mvc.HttpPost] figure au-dessus de ma méthode POST.

J'ai changé cela pour utiliser :

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

Cela a résolu mes problèmes. J'espère que cela aidera quelqu'un d'autre.

Pour être complet, j'avais ce qui suit dans mon web.config :

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

1voto

Panos Roditakis Points 79

Dans mon cas, j'avais un dossier physique dans le projet avec le même nom que la route WebAPI (ex. sandbox) et seule la requête POST était interceptée par le gestionnaire de fichiers statiques dans IIS (évidemment).

Le fait d'obtenir une erreur trompeuse 405 au lieu de la 404 attendue est la raison pour laquelle il m'a fallu du temps pour résoudre le problème.

Ce n'est pas facile de tomber dans ce piège, mais c'est possible. J'espère que cela aidera quelqu'un.

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