ASP.NET Web API 2自定义路由到特定方法

时间:2017-09-14 06:54:41

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

如何在ASP.NET Web API中配置路由以使用GET方法将其路由到控制器中的特定方法?

http://mysite/healthcheck

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);
    }    
}

点击该网址时,我找不到,而不是确定。任何帮助将不胜感激

更新 谢谢你的所有建议,我检查了所有的建议,没有任何建议。路由调试器显示没有匹配项。我暂时搁置这个。

4 个答案:

答案 0 :(得分:2)

Startup.cs注册属性路由中:

config.MapHttpAttributeRoutes();

在控制器中:

[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController
{
    [HttpGet]
    [Route]
    public IHttpActionResult GetHealthCheckStatus()
    {
        return Ok();
    }
}

答案 1 :(得分:2)

在配置

中删除它
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);
    }
}

答案 2 :(得分:1)

我没有为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并启用路由调试,也可以查看调用的路由以及参数是什么。

答案 3 :(得分:1)

由于您启用了属性路由,因此可以使用[Route("")]使用空路由模板将操作指定为控制器的默认端点。

[RoutePrefix("healthcheck")]
public class HealthCheckController : ApiController {
    [HttpGet]
    [Route("")] // Matches GET http://mysite/healthcheck
    public IHttpActionResult GetHealthCheckStatus() {
        return Ok();
    }
}

通过上述内容,不需要来自OP的基于约定的 HealthCheck 路由。可以从 WebApiConfig

安全地删除它