Web API路由到操作名称

Dav*_*ave 18 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" };
}
Run Code Online (Sandbox Code Playgroud)

通过URL访问:

http://mysite/services/methodfruit
Run Code Online (Sandbox Code Playgroud)

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

http://mysite/api/services
Run Code Online (Sandbox Code Playgroud)

哪个调用GET方法.

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

Len*_*rri 32

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

查看此官方文档:

ASP.NET Web API中的路由

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

按操作名称路由

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

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

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

[HttpGet]
public string[] MethodFruit()
{
    return new string[] { "Apple", "Orange", "Banana" };
}
Run Code Online (Sandbox Code Playgroud)


Mah*_*esh 8

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

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

然后你可以发出GET请求

http://mysite/api/Services/MethodFruit
Run Code Online (Sandbox Code Playgroud)


Pra*_*M P 7

添加有关上述答案的其他信息.添加RoutePrefix有时会解决问题.希望它能帮助

Controller

    [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" };
        }
    }
Run Code Online (Sandbox Code Playgroud)

在配置中

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