Asp.net web api 为什么两个相同的REST请求中的一个有效,而另一个无效?

Asp.net web api 为什么两个相同的REST请求中的一个有效,而另一个无效?,asp.net-web-api,https,asp.net-web-api2,dotnet-httpclient,Asp.net Web Api,Https,Asp.net Web Api2,Dotnet Httpclient,我有两个小控制器: [AllowAnonymous] [RoutePrefix("api/Org")] public class OrgController : BaseController { [HttpPost] public async Task<IEnumerable<Organization>> Get() { Db.Configuration.LazyLoadingEnabled = false; ret

我有两个小控制器:

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

当我请求ORG时,我有一个成功的请求返回4个ORG,但是当我请求分支时,我得到一个带有HTTP405-不允许使用的方法的响应。现在我知道我正在使用POST来请求
Get
方法,但很久以前我就知道它出于某种原因更安全,而且通常工作正常

这里的要点是,这种经过验证的模式一直对我有效,并且对整个应用程序中的所有其他此类控制器和POST请求都有效。什么会使请求
“/api/Branch”
失败

更新:我将操作方法签名更改为如下所示,现在可以正常工作:

[HttpPost]
[Route("Get")]
public async Task<IEnumerable<Branch>> Fetch()
[HttpPost]
[路线(“获取”)]
公共异步任务获取()

这很奇怪,因为POST请求直接作用于所有其他控制器上的
Get
操作,只要
HttpPost
属性存在。我的问题已经解决了,但为什么这个问题仍然悬而未决。与Jinish的回答相反,路由前缀开头的
/
似乎没有什么区别。有些控制器有,有些没有,它们都能工作,除了
BranchController

我不相信你的[RoutePrefix]能以“/”开头
应该是[RoutePrefix(“api/Branch”)]

我不相信您的[RoutePrefix]可以以“/”开头
它应该是[RoutePrefix(“api/Branch”)]

我使用的是
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;

我使用的是
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;

尝试删除
/
,我仍然得到完全相同的行为,但是,当我更改操作名称并将其别名为
get
时,事情开始正常工作。请查看上面的编辑。尝试删除
/
,我仍然得到完全相同的行为,但是,当我更改操作名称并将其别名为
get
时,事情开始正常工作。请参见上面的编辑。您缺少
[Route]
属性,因此实际情况是它默认返回到基于约定的路由
[Route(“”)
将适用于这两个操作。您缺少
[Route]
属性,因此实际发生的情况是它默认返回到基于约定的路由<代码>[Route(“”)对这两种操作都有效。
[HttpPost]
[Route("Get")]
public async Task<IEnumerable<Branch>> Fetch()
using System.Collections.Generic;
using System.Data.Entity;
using System.Threading.Tasks;
using System.Web.Http;
//using System.Web.Mvc;