代码之家  ›  专栏  ›  技术社区  ›  Mykhailo Seniutovych

如何在Asp的url参数中发送控制器操作。NETWebAPI?

  •  0
  • Mykhailo Seniutovych  · 技术社区  · 7 年前

    通常,您调用控制器的一个操作,如下所示 http://hostname/MyController/MyAction 我对我的Web Api有如下要求: http://hostname/MyController?action=MyAction ,即在url参数中传递操作。

    我的控制器:

    public class MyController : ApiController
    {
        [HttpGet]
        [Route("WHAT SHOULD BE HERE??")]
        public IHttpActionResult MyAction()
        {
            // some code 
        }
    }
    

    你知道我怎么能写这样的路由吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   becnelli    7 年前

    您可以尝试以下方法:

    public class MyController : ApiController
    {
        [HttpGet]
        [Route("MyController")]
        public IHttpActionResult MyInnerController(String action)
        {
            switch(action)
            {
                case "MyAction":
                    return MyAction();
            }
    
            return BadRequest("Invalid action: " + action);
        }
    
        public IHttpActionResult MyAction()
        {
            return Ok();
        }
    }
    

    如果需要额外的参数,事情会变得更加复杂。

        2
  •  1
  •   Mykhailo Seniutovych    7 年前

    一年多以后,我可以回到这个问题上来,自己回答。 您可以在这里使用的解决方案是编写自己的 ActionSelector -这是WebAPI框架用于选择操作的类,默认情况下使用 System.Web.Http.Controllers.ApiControllerActionSelector ,您可以覆盖它。

    假设您的控制器如下所示:

    public class MyController : ApiController
    {
        [HttpGet]
        public IHttpActionResult MyAction()
        {
            // some code 
        }
    }
    

    然后您可以像这样创建自己的操作选择器(代码可能会有所改进,我写得很快):

    public class QueryParameterActionSelector : ApiControllerActionSelector
    {
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            var mapping = GetActionMapping(controllerContext.ControllerDescriptor);
    
            var parameters = controllerContext.Request.GetQueryNameValuePairs();
            foreach (var parameter in parameters)
            {
                if (parameter.Key == "action")
                {
                    if (mapping.Contains(parameter.Value))
                    {
                        // Provided that all of your actions have unique names.
                        // Otherwise mapping[parameter.Value] will return multiple actions and you will have to match by the method parameters.
                        return mapping[parameter.Value].First();
                    }
                }
            }
    
            return null;
        }
    }
    

    最后,您必须在中注册此操作选择器 WebApiConfig.Register 方法它将如下所示:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}"
            );
    
            config.Services.Replace(typeof(IHttpActionSelector), new QueryParameterActionSelector());
        }
    }
    

    现在你可以这样说了 http://hostname/controller?action=MyAction

    推荐文章