ASP.NET Web API 2 到特定方法的自定义路由
ASP.NET Web API 2 custom routing to specific method
如何在 ASP.NET Web API 中配置路由以使用 GET 方法将其路由到控制器中的特定方法?
WebAPIConfig 中的注册如下所示:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "HealthCheck",
routeTemplate: "healthcheck",
defaults: new { action =" DefaultAction" }
);
控制器看起来像这样:
[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController
{
[HttpGet]
[ActionName("DefaultAction")]
public HttpResponseMessage GetHealthCheckStatus()
{
return Request.CreateResponse(HttpStatusCode.OK);
}
}
我点击 URL 时得到 Not Found 而不是 Ok。任何帮助将不胜感激
更新
感谢您的所有建议,我检查了所有建议并且 none 有效。路由调试器显示没有匹配项。我暂时搁置这个。
在您的 Startup.cs
注册属性路由中:
config.MapHttpAttributeRoutes();
在控制器中:
[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController
{
[HttpGet]
[Route]
public IHttpActionResult GetHealthCheckStatus()
{
return Ok();
}
}
在配置中删除它
config.Routes.MapHttpRoute(
name: "HealthCheck",
routeTemplate: "healthcheck",
defaults: new { action =" DefaultAction" }
);
并在控制器中执行此操作
public class HealthCheckController : ApiController
{
[AcceptVerbs("GET")]
[Route("healthcheck")]
public HttpResponseMessage GetHealthCheckStatus()
{
return Request.CreateResponse(HttpStatusCode.OK);
}
}
我还没有针对 web-api 测试过它,但是针对 MVC 测试过它,我认为它应该可以正常工作。
在路由注册中,您应该确保这条路由在标准 api 路由之前,因为路由顺序很重要:
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"HealthCheck",
"healthcheck",
new {Controller = "Default", action = "Index"}
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
}
在控制器中,您不能为控制器和动作名称添加前缀,但要在模板中指定正确的控制器名称和动作名称:
public class DefaultController : Controller
{
[HttpGet]
public ActionResult Index()
{
return Content("I'm hit");
}
}
如果您仍然遇到问题,那么您可以阅读 this article 并启用路由调试以查看调用了哪个路由以及参数是什么。
由于您正在启用属性路由,因此您可以使用 RoutePrefix
将操作指定为控制器的默认端点,方法是将 [Route("")]
与空路由模板一起使用。
[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController {
[HttpGet]
[Route("")] // Matches GET http://mysite/healthcheck
public IHttpActionResult GetHealthCheckStatus() {
return Ok();
}
}
有了上面的内容,就不需要来自 OP 的基于约定的 HealthCheck 路由。它可以从 WebApiConfig
中安全删除
如何在 ASP.NET Web API 中配置路由以使用 GET 方法将其路由到控制器中的特定方法?
WebAPIConfig 中的注册如下所示:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "HealthCheck",
routeTemplate: "healthcheck",
defaults: new { action =" DefaultAction" }
);
控制器看起来像这样:
[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController
{
[HttpGet]
[ActionName("DefaultAction")]
public HttpResponseMessage GetHealthCheckStatus()
{
return Request.CreateResponse(HttpStatusCode.OK);
}
}
我点击 URL 时得到 Not Found 而不是 Ok。任何帮助将不胜感激
更新 感谢您的所有建议,我检查了所有建议并且 none 有效。路由调试器显示没有匹配项。我暂时搁置这个。
在您的 Startup.cs
注册属性路由中:
config.MapHttpAttributeRoutes();
在控制器中:
[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController
{
[HttpGet]
[Route]
public IHttpActionResult GetHealthCheckStatus()
{
return Ok();
}
}
在配置中删除它
config.Routes.MapHttpRoute(
name: "HealthCheck",
routeTemplate: "healthcheck",
defaults: new { action =" DefaultAction" }
);
并在控制器中执行此操作
public class HealthCheckController : ApiController
{
[AcceptVerbs("GET")]
[Route("healthcheck")]
public HttpResponseMessage GetHealthCheckStatus()
{
return Request.CreateResponse(HttpStatusCode.OK);
}
}
我还没有针对 web-api 测试过它,但是针对 MVC 测试过它,我认为它应该可以正常工作。
在路由注册中,您应该确保这条路由在标准 api 路由之前,因为路由顺序很重要:
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"HealthCheck",
"healthcheck",
new {Controller = "Default", action = "Index"}
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
}
在控制器中,您不能为控制器和动作名称添加前缀,但要在模板中指定正确的控制器名称和动作名称:
public class DefaultController : Controller
{
[HttpGet]
public ActionResult Index()
{
return Content("I'm hit");
}
}
如果您仍然遇到问题,那么您可以阅读 this article 并启用路由调试以查看调用了哪个路由以及参数是什么。
由于您正在启用属性路由,因此您可以使用 RoutePrefix
将操作指定为控制器的默认端点,方法是将 [Route("")]
与空路由模板一起使用。
[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController {
[HttpGet]
[Route("")] // Matches GET http://mysite/healthcheck
public IHttpActionResult GetHealthCheckStatus() {
return Ok();
}
}
有了上面的内容,就不需要来自 OP 的基于约定的 HealthCheck 路由。它可以从 WebApiConfig
中安全删除