适用于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
我可以看到这个控制器方法的潜在问题:
问题是,你的参数是类型int
(基本类型)-只要你不把它标记为[FromBody]
的WebApi参数绑定引擎将假设它来自url。这就解释了为什么GET有效;我不确定当你不提供url中的值时,POST是如何考虑的。
仍然,如果您将maxRecords标记为FromBody并尝试使用GET方法,它很可能会停止工作。另外,请注意,如果您想使用form-urlencoded
字符串作为帖子主体,只有一个键值对,那么为了使其工作,您需要将其作为"=10"
而不是"maxRecords=10"
发布。
要检查这是否是导致方法失败的问题,我将暂时删除GET支持,只留下POST,并将参数标记为FromBody。