J'ai ces deux petits contrôleurs:Pourquoi l'une des deux demandes REST identiques fonctionne-t-elle et pas l'autre?
[AllowAnonymous]
[RoutePrefix("api/Org")]
public class OrgController : BaseController
{
[HttpPost]
public async Task<IEnumerable<Organization>> Get()
{
Db.Configuration.LazyLoadingEnabled = false;
return await Db.Organizations.ToListAsync();
}
}
et
[AllowAnonymous]
[RoutePrefix("/api/Branch")]
public class BranchController : BaseController
{
[HttpPost]
public async Task<IEnumerable<Branch>> Get()
{
Db.Configuration.LazyLoadingEnabled = false;
return await Db.Branches.ToListAsync();
}
}
Et je les appelle comme ça, respectivement, en utilisant un System.Net.Http.HttpClient
:
HttpResponseMessage response = await Client.PostAsync("/api/Org", null, cancellation);
et
HttpResponseMessage response = await Client.PostAsync("/api/Branch", null, cancellation);
Quand je demande des Orgs, j'ai une demande réussie qui renvoie 4 Orgs, mais quand je demande des Branches, j'obtiens une réponse avec HTTP 405 - Méthode non autorisée. Maintenant, je sais que j'utilise POST pour faire des demandes à Get
méthodes, mais il y a quelque temps, j'ai appris que c'était pour une raison plus sûre, et cela fonctionne normalement bien.
Le point principal ici est que ce modèle éprouvé a toujours fonctionné pour moi, et fonctionne pour tous les autres contrôleurs de ce type et les demandes POST dans l'ensemble de l'application. Que pourrait faire juste la demande pour "/api/Branch"
échouer?
MISE À JOUR: J'ai changé la signature de la méthode d'action pour ressembler à ceci, et il fonctionne très bien maintenant:
[HttpPost]
[Route("Get")]
public async Task<IEnumerable<Branch>> Fetch()
Ceci est étrange, parce que les requêtes POST travaillent directement aux Get
actions sur tous les autres contrôleurs , tant que l'attribut HttpPost
est présent. Mon problème est travaillé, mais cette question reste ouverte quant à pourquoi. Contrairement à la réponse de Jinish, le /
au début du préfixe d'itinéraire ne semble pas faire de différence. Certains contrôleurs l'ont eu, d'autres pas, et ils ont tous travaillé, sauf pour BranchController
.
Il vous manquait l'attribut '[Route]', ce qui était en train de se produire était qu'il revenait au routage conventionnel. '[Route (" ")]' fonctionnerait pour les deux actions. – Nkosi