0

У меня есть эти две маленькие контроллеры:Почему один из двух одинаковых запросов REST работает, а не другой?

[AllowAnonymous] 
[RoutePrefix("api/Org")] 
public class OrgController : BaseController 
{ 
    [HttpPost] 
    public async Task<IEnumerable<Organization>> Get() 
    { 
     Db.Configuration.LazyLoadingEnabled = false; 
     return await Db.Organizations.ToListAsync(); 
    } 
} 

и

[AllowAnonymous] 
[RoutePrefix("/api/Branch")] 
public class BranchController : BaseController 
{ 
    [HttpPost] 
    public async Task<IEnumerable<Branch>> Get() 
    { 

     Db.Configuration.LazyLoadingEnabled = false; 
     return await Db.Branches.ToListAsync(); 
    } 
} 

И я называю их, как это, соответственно, с использованием System.Net.Http.HttpClient:

HttpResponseMessage response = await Client.PostAsync("/api/Org", null, cancellation); 

и

HttpResponseMessage response = await Client.PostAsync("/api/Branch", null, cancellation); 

Когда я запрашиваю Orgs, у меня есть успешный запрос, который возвращает 4 Orgs, но когда я запрашиваю ветви, я получаю ответ с HTTP 405 - Метод не разрешен. Теперь я знаю, что использую POST для запросов на методы Get, но когда-то давно я узнал, что это по какой-то причине более безопасно, и нормально работает нормально.

Главное, что этот проверенный шаблон всегда работал для меня и работает для всех других таких контроллеров и POST-запросов во всем приложении. Что может сделать провал только для "/api/Branch"?

UPDATE: Я изменил метод действий подписи, чтобы посмотреть, как это, и теперь он работает отлично:

[HttpPost] 
[Route("Get")] 
public async Task<IEnumerable<Branch>> Fetch() 

Это странно, потому что запросы POST работать непосредственно на Get действия на всех других контроллерах , пока присутствует атрибут HttpPost. Моя проблема решена, но этот вопрос остается открытым относительно того, почему. В отличие от ответа Цзиниша, / в начале префикса маршрута, похоже, не имеет значения. У некоторых контроллеров это было, некоторые - нет, и все они работали, за исключением BranchController.

+0

Вам не хватает атрибута '[Route]', так что на самом деле произошло то, что он по умолчанию вернулся к маршрутизации на основе условных обозначений. '[Route (" ")]' будет работать для обоих действий. – Nkosi

ответ

0

Я использовал System.Web.Mvc.AllowAnonymousAttribute вместо System.Web.Http.AllowAnonymousAttribute. Используя современные удобства, когда я добавил атрибут, мне было предложено (я думаю, ReSharper, но, может быть, сам VS), чтобы импортировать пространство имён. В моей спешке я не заметил, что они были двумя пространствами имен в качестве опций, и я выбрал неправильный. Коррекция выглядит следующим образом:

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

Я не верю, что ваш [RoutePrefix] может начать с '/' Это должно быть [RoutePrefix ("API/Branch")]

+0

Попробовал удалить '/', и я все равно получаю точно такое же поведение, но когда я изменил имя действия и навел его на 'Get', все стало нормально работать. См. Мое редактирование выше, пожалуйста. – ProfK

Смежные вопросы