Web API方法永远不会路由到

and*_*ewb 2 c# asp.net-web-api

我之前玩过Web API,但似乎总是遇到我的方法无法路由到的相同问题。

我的应用程序具有该应用程序见解包,因此我可以看到它捕获了我提出的请求-通过查看方法签名上方的请求行,但它们从未真正执行过,并且App Insights报告失败的请求。

这是我的WebApiConfig

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

这是我简单的控制器和方法

public class ExampleController : ApiController
{
    [HttpGet]
    [ActionName("Test")]
    public IHttpActionResult Test()
    {
        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是MVC应用程序的一部分,因此,当我启动项目时,“主页/索引”视图将显示在浏览器中。然后,我去邮递员创建一个新的Get请求,指向

http://localhost:port/api/Example/Test
Run Code Online (Sandbox Code Playgroud)

但这导致404。

我一定做错了,因为我总是碰到这个

Jon*_*ase 5

WebAPI的默认映射不包括该操作作为路由的一部分,因为默认情况下,它希望控制器是资源的主要标识符,并希望GET / POST / PUT / DELETE动词来定义运行哪个操作。

因此,即使您手动指定ActionName为“ Test”,默认处理程序中也没有任何内容可以对其进行模式匹配。

您可以调整默认映射以包括操作,如下所示:

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

但是,您可能会发现您更喜欢属性路由(我知道),您可以将其应用于您的控制器,如下所示:

[RoutePrefix("api/Example")]
public class ExampleController : ApiController
{
    [HttpGet]
    [Route("Test")]
    public IHttpActionResult Test()
    {
        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

要启用属性路由,您将需要在启动配置中添加以下内容:

config.MapHttpAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)