1

我的 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 64 带 4GB 内存
  • 带有 Resharper 的 Visual Studio 2012 专业更新 2
  • IIS Express 8
  • .NET 框架 4.5
4

1 回答 1

2

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

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

尽管如此,如果您将 maxRecords 标记为 FromBody 并尝试将其与 GET 方法一起使用,它很可能会停止工作。另外,请注意,如果您想将form-urlencoded字符串用于仅具有一个键值对的帖子正文,那么要使其正常工作,您需要将其发布为"=10"而不是"maxRecords=10".

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

于 2013-05-04T20:36:59.253 回答