Web API路由到操作名称

时间:2013-09-06 16:03:12

标签: c# asp.net-web-api asp.net-web-api-routing

我需要一个控制器来返回JSON以供JavaScript使用,所以我继承了ApiController类,但它的行为并不像我预期的那样。 Apress的书Pro ASP.NET MVC 4以及我发现的大多数在线示例给出了例如:

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

通过网址访问:

http://mysite/services/methodfruit

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

http://mysite/api/services

调用GET方法。

我检查了Apress网站,但他们似乎没有任何论坛,目前的源代码是在VS 2012,我没有使用。我检查了源文件,他们似乎认为前一种方法应该有效。是不再支持前一种方法了?

4 个答案:

答案 0 :(得分:29)

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

查看此官方文档:

Routing in 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" };
}

答案 1 :(得分:7)

如果希望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

答案 2 :(得分:5)

在上述答案中添加其他信息。添加 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 } );

答案 3 :(得分:0)

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

using System.Web.Mvc; 

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

代替了它
using System.Web.Http 

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