19

我需要一个控制器来返回 JSON 以供 JavaScript 使用,因此我从ApiController该类继承,但它的行为不像我预期的那样。Apress book Pro ASP.NET MVC 4 和我发现的大多数在线示例都提供了如下示例:

public class ServicesController : ApiController
{
    public string[] MethodFruit()
    {
        return new string[] { "Apple", "Orange", "Banana" };
}

通过 URL 访问:

http://mysite/services/methodfruit

但这永远不会奏效 - 找不到资源。我可以使用的唯一方法是让控制器为每个 HTTP 动词包含不同的方法,然后:

http://mysite/api/services

它调用 GET 方法。

我查看了 Apress 网站,但他们似乎没有任何论坛,并且当前的源代码在我没有使用的 VS 2012 中。我检查了源文件,他们似乎认为前一种方法应该可行。不再支持以前的方法吗?

4

4 回答 4

34

是的...通常您必须遵循 ASP.NET WEB API 所期望的默认命名约定。

检查这个官方文档:

ASP.NET Web API 中的路由

如果您不想遵循约定,可以尝试上述链接文档中描述的按操作名称路由部分。

按操作名称路由

使用默认路由模板,Web API 使用 HTTP 方法来选择操作。但是,您也可以创建一个路由,其中​​操作名称包含在 URI 中:

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );

在你的情况下,你必须这样做:

[HttpGet]
public string[] MethodFruit()
{
    return new string[] { "Apple", "Orange", "Banana" };
}
于 2013-09-06T16:12:29.673 回答
8

如果您希望 Web API 在路由时查找操作名称,请将 App_Start 文件夹中的 WebApiConfig.cs 类更改为:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

然后你可以发出一个 GET 请求

http://mysite/api/Services/MethodFruit
于 2013-09-06T16:14:24.947 回答
7

添加有关上述答案的其他信息。添加RoutePrefix有时会解决问题。希望对

控制器有帮助

    [RoutePrefix("api/Services")]
    public class ServicesController : ApiController
    {
        [System.Web.Http.AcceptVerbs("GET", "POST")]
        [System.Web.Http.HttpGet]
        [Route("MethodFruit")]
        public string[] MethodFruit()
        {
            return new string[] { "Apple", "Orange", "Banana" };
        }
    }

在配置中

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );
于 2016-02-18T16:27:55.273 回答
0

我面临同样的问题,我发现在我的代码

using System.Web.Mvc; 

我已经导入了 Mvc 而不是使用 System.Web.Http。所以它使用的是 Mvc 路由而不是 webApi 路由。我已经用

using System.Web.Http 

它对我有用。我正在添加我的答案,所以新手不会重复同样的错误

于 2018-01-11T07:21:11.993 回答