У меня есть эти две маленькие контроллеры:Почему один из двух одинаковых запросов 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
.
Вам не хватает атрибута '[Route]', так что на самом деле произошло то, что он по умолчанию вернулся к маршрутизации на основе условных обозначений. '[Route (" ")]' будет работать для обоих действий. – Nkosi