ASP.NET MVC API 路由

ASP.NET MVC API Routing

我正在尝试在我的 ASP.NET MVC 应用程序中创建到 API 的路由。对此 API 的调用示例如下所示:

/MyApp/api/lookup/person?i1=123&i2=test
/MyApp/api/lookup/product?i1=597&i2=1234
/MyApp/api/lookup/order?i1=1&i2=597

路由的一般结构如下所示:

/{AppRoot}/api/lookup/{someKey}?i1={value1}&i2={value2}

我在 WebApiConfig.cs 文件中添加了一条路由,如下所示:

config.Routes.MapHttpRoute(
  name: "LookupApi",
  routeTemplate: "api/lookup/{action}",
  defaults: new { controller = "LookupApi", action = "Index" }
);

然后我有一个这样定义的控制器:

public class LookupApiController
{
  [HttpGet]
  public async Task<IHttpActionResult> Index()
  {
    return Ok();
  }
}

当我在 Index 操作中设置断点时,它没有被调用。我不懂为什么。我希望有一种简单的方法来查看为给定路由调用了什么控制器操作以及映射到哪一行代码。无论哪种方式,如何解决我的查找操作未被调用的问题?

根据您定义的 routeTemplate: "api/lookup/{action}",对于 url 如 /MyApp/api/lookup/person?i1=123&i2=test,它将以 person 作为操作名称,并尝试查找名为 [= LookupApiController 中的 14=] 不存在。

我不确定你是否想创建这些动作来适应你的结构,让例子 url 命中 Index 动作的一个直接的方法是改变你的路线至:

config.Routes.MapHttpRoute(
  name: "LookupApi",
  routeTemplate: "api/lookup/{someKey}",
  defaults: new { controller = "LookupApi", action = "Index" }
);

这样你的url中的person将不再代表动作名称,你可以在Index动作中获取值作为参数:

public class LookupApiController
{
  [HttpGet]
  public async Task<IHttpActionResult> Index(string someKey)
  {
    //DO something
    return Ok();
  }
}