我有这两个小控制器:
[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,但是当我请求Branches时,我收到了 HTTP 405 - Method not allowed 的响应。现在我知道我正在使用POST向Get
方法发出请求,但很久以前我才知道它出于某种原因更加安全,并且通常可以正常工作。
这里的要点是,这种经过验证的模式对我来说一直很有用,并且适用于整个应用程序中的所有其他此类控制器和POST请求。什么才能使"/api/Branch"
的请求失败?
更新:我将操作方法签名更改为如下所示,现在工作正常:
[HttpPost]
[Route("Get")]
public async Task<IEnumerable<Branch>> Fetch()
这很奇怪,因为只要Get
属性存在,POST请求就可以直接用于所有其他控制器上的HttpPost
操作。我的问题已解决,但这个问题仍然存在。与Jinish的回答相反,路由前缀开头的/
似乎没有区别。有些控制器有它,有些没有,除了BranchController
之外它们都有效。
答案 0 :(得分:2)
我不相信你的[RoutePrefix]可以以&#39; /&#39; 它应该是[RoutePrefix(&#34; api / Branch&#34;)]
答案 1 :(得分: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;