-1

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

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

打的是URL,当我没有发现,而不是确定。任何帮助,将不胜感激

UPDATE 谢谢你的所有建议,我检查了他们都没有工程。路由调试器显示没有匹配。我搁置一会儿。

回答

1

在你Startup.cs寄存器属性路线:

config.MapHttpAttributeRoutes(); 

和Controller:

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

谢谢你的回答,但它仍然无法正常工作。 –

+0

您是否从'HttpRouteCollection'中删除了HealthCheck路线? – peco

+0

你的意思是“config.Routes.MapHttpRoute(name:”HealthCheck“...)吗?是的,我没有帮助 –

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

谢谢你的回答。但它没有帮助 –

+0

您的配置可能存在一些问题\ –

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并启用路由调试也看哪个路线调用,什么是PARAMS。

+0

谢谢你的回答,它没有奏效。 –

+0

在您的项目中可能会出现其他问题,导致路由变得疯狂。我建议你创建一个小型项目,并检查是否可以重现你在那里描述的问题。如果是的话 - 把它放在这里,如果不是的话 - 检查你的代码有什么不同。 – 3615

1

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

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

通过以上那么就没有必要从OP基于惯例,健康检查路线。它可以安全地从WebApiConfig