【问题标题】:Multiple Get function in WEB API ControllerWEB API Controller中的多个Get功能
【发布时间】:2016-12-12 13:20:06
【问题描述】:

我正在创建一个 Web Api 控制器。我想在单个控制器中创建多个 Get 函数。见下文:

    // GET api/User/5
    [ResponseType(typeof(UserModel))]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

我怎样才能做到这一点,以便我可以通过 URL 调用这两个函数?

【问题讨论】:

  • 显示路由配置。
  • 我已经做到了朋友们。谢谢。
  • 添加在下面。请向下滚动。
  • 您的路线配置不符合您的需求。你需要在api/{controller}/{id} 之前指定api/{controller}/{action}/{id} 也使用属性路由,你需要这个config.MapHttpAttributeRoutes();

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


【解决方案1】:

使用方法和 webapiconfig 文件中指定的路由。

喜欢 关于方法

[ResponseType(typeof(UserModel))]
[HttpGet]
[Route("api/getusers/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);

    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}
like others
[Route("api/getcities/{id}")]

或者你可以在文件中指定

       config.Routes.MapHttpRoute(
        name: "users",
        routeTemplate: "api/getusers/{id}",
        defaults: new { action = "GetUser", controller = "Users" }
        );

这样你可以指定其他人

【讨论】:

  • 非常感谢您
【解决方案2】:

IMO 最简单的方法是使用attribute routing 执行此操作。 在每个方法前面添加路由参数,您可以在其中指定方法路由。

// GET api/User/5
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);

    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
    var item = repository.GetCities(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

【讨论】:

    【解决方案3】:

    下面是我的 WebApi 路由配置

     public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            // Controllers with Actions
            // To handle routes like `/api/VTRouting/route`
            config.Routes.MapHttpRoute(
                name: "DefaultApiwithActionID",
                routeTemplate: "api/{controller}/{action}/{id}",
                 defaults: new { id = RouteParameter.Optional } 
            );
        }
    

    下面是我的 API 控制器

           // GET api/User/5
        [ResponseType(typeof(UserModel))]
        [Route("api/UserApi/GetUser")]
        public IHttpActionResult GetUser(Guid id)
        {
            var item = repository.Get(id);
    
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            else
            {
                return Ok(item);
            }
        }
    
        // GET api/User/5
        [ResponseType(typeof(TanentDocumentsModel))]
        [Route("api/UserApi/GetUserDocuments")]
        public IHttpActionResult GetUserDocuments(Guid id)
        {
            var item = repository.GetUserDocuments(id);
    
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            else
            {
                return Ok(item);
            }
        }
    
        // GET api/User/GetCities/5
        [ResponseType(typeof(CityModel))]
        [Route("api/UserApi/GetCities")]
        public IHttpActionResult GetCities(int id)
        {
            var item = repository.GetCities(id);
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            else
            {
                return Ok(item);
            }
        }
    
        // GET api/User/GetCities/5
        [ResponseType(typeof(StateModel))]
        [Route("api/UserApi/GetStates")]
        public IHttpActionResult GetStates(int id)
        {
            var item = repository.GetStates(id);
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            else
            {
                return Ok(item);
            }
        }
    

    【讨论】:

    • 好的,交换两个路由配置并确保在这两个之前包含属性路由。除此之外的事情应该没问题。查看@Ric 在您原始帖子中的评论。
    【解决方案4】:

    最简单的方法,更新 webapiconfig 文件。

    // GET api/User/5
    [HttpGet]    
    [ResponseType(typeof(UserModel))]
    [Route("api/User/{id}")]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);    
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }
    
    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    [Route("api/User/GetCities/{id}")]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }
    

    您还必须将其分配到区域 API 文件夹 ApiAreaRegistration.cs 文件中

    context.Routes.MapHttpRoute(
    "Api_default",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { area = "Api", id = RouteParameter.Optional }
    );
    

    这样,你要根据你的项目来分配

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多