【问题标题】:ASP.NET Web API 2 custom routing to specific methodASP.NET Web API 2 自定义路由到特定方法
【发布时间】:2018-02-23 01:01:54
【问题描述】:

如何在 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);
    }    
}

点击该 URL 时,我得到 Not Found 而不是 Ok。任何帮助将不胜感激

更新 感谢您的所有建议,我检查了所有建议,但没有一个有效。路由调试器显示没有匹配项。我暂时搁置了。

【问题讨论】:

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


    【解决方案1】:

    在你的Startup.cs注册属性路由:

    config.MapHttpAttributeRoutes();
    

    在控制器中:

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

    【讨论】:

    • 谢谢你的回答,但还是不行。
    • 您是否从 HttpRouteCollection 中删除了 HealthCheck 路由?
    • 你的意思是 "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);
        }
    }
    

    【讨论】:

    • 感谢您的回答。但这并没有帮助
    • 您的配置可能有问题\
    【解决方案3】:

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

    【讨论】:

    • 您的项目中可能还有其他问题导致路由变得疯狂。我建议您创建一个小项目并检查是否可以重现您在那里描述的问题。如果是 - 把它放在这里,如果不是 - 检查你的代码有什么不同。
    【解决方案4】:

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

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

    有了以上内容,就不需要来自 OP 的基于约定的 HealthCheck 路由。它可以安全地从 WebApiConfig

    中移除

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多