0

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.

+0

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

Répondre

0

j'utilisais System.Web.Mvc.AllowAnonymousAttribute au lieu de System.Web.Http.AllowAnonymousAttribute. En utilisant les commodités modernes, quand j'ai ajouté l'attribut, j'ai été invité (je pense par ReSharper, mais peut-être par VS lui-même) à importer un espace de noms pour cela. Dans ma hâte, je n'ai pas remarqué qu'il y avait deux espaces de noms comme options et j'ai choisi la mauvaise. La correction est la suivante:

using System.Collections.Generic; 
using System.Data.Entity; 
using System.Threading.Tasks; 
using System.Web.Http; 
//using System.Web.Mvc; 
2

Je ne crois pas que votre [RoutePrefix] peut commencer par un '/' Il devrait être [RoutePrefix ("api/Direction")]

+0

Essayé de supprimer le '/' et j'ai toujours exactement le même comportement, mais, quand j'ai changé le nom de l'action, et aliasé à 'Get', les choses ont bien fonctionné. Voir ma modification ci-dessus s'il vous plaît. – ProfK