为什么两个相同的REST请求之一工作而不是另一个?

时间:2016-11-22 12:02:40

标签: 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;
        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之外它们都有效。

2 个答案:

答案 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;