适用于GET,不适用POST(404错误)

本文关键字:错误 POST GET 不适用 适用于 | 更新日期: 2023-09-27 18:12:03

我在我的MVC4项目中有一个WebApi控制器ServicesApiController,签名如下:

[Authorize(Roles = "sysadmin,Secretary")]
[AcceptVerbs("GET", "POST")]
public IEnumerable<Stock> TopRankedStocks(int maxRecords)
{
    // do stuff
    return result;
}

我的api控制器的路由是这样的:

config.Routes.MapHttpRoute(
    name: "ServicesApi",
    routeTemplate: "api/{controller}/{action}",
    defaults: new { controller = "ServicesApi", action="Index" }
    );

使用IIS Express,如果我在浏览器中导航到http://localhost:62281/api/ServicesApi/TopRankedStocks?maxRecords=20,我会得到一个很好的数据对象xml列表。

然而,如果我这样称呼它:

myHttpClient.BaseAddress = "http://localhost:62281/";
var arguments = new List<KeyValuePair<string, string>>(new[] { KeyValuePair<string, string>("maxRecords", "10") });
var content = new FormUrlEncodedContent(arguments);
var result = myHttpClient.PostAsJsonAsync("/api/ServicesApi/TopRankedStocks", content).Result;

…我得到一个404(未找到)错误。

POST操作在我的代码中的其他地方工作。我的应用程序和IIS Express的配置文件都允许所有动词。我不知道为什么不行。有人能给我提示一下吗?

我不知道这些信息是否相关,但我还是把它们贴出来,以防有什么价值:

  • Windows 8 64w/4GB RAM
  • Visual Studio 2012 Professional Update 2 with Resharper
  • IIS Express 8
  • 。. NET Framework 4.5

适用于GET,不适用POST(404错误)

我可以看到这个控制器方法的潜在问题:

问题是,你的参数是类型int(基本类型)-只要你不把它标记为[FromBody]的WebApi参数绑定引擎将假设它来自url。这就解释了为什么GET有效;我不确定当你不提供url中的值时,POST是如何考虑的。

仍然,如果您将maxRecords标记为FromBody并尝试使用GET方法,它很可能会停止工作。另外,请注意,如果您想使用form-urlencoded字符串作为帖子主体,只有一个键值对,那么为了使其工作,您需要将其作为"=10"而不是"maxRecords=10"发布。

要检查这是否是导致方法失败的问题,我将暂时删除GET支持,只留下POST,并将参数标记为FromBody。