C#MapHttpAttibuteRoutes不能使用不同的参数相同的动作?

时间:2018-09-07 01:41:22

标签: c# rest api

我是C#的新手,并且无法使用属性路由。

现在,我想为GET,POST,PUT和DELETE用户创建一个API。

我不知道如何描述问题,我发现最熟悉的问题不是我的案子的正确答案。

How to use Route attribute to bind query string with web API?

[HttpGet]
public class UsersController : ApiController
{
    // GET /api/users
    [HttpGet]
    [Route("")]
    public IEnumerable<User> GetUsers()
    {
        return _context.Users.ToList();
    }

    [Route("api/users/{FirstName?}/{LastName?}")]
    public IEnumerable<User> GetByFirstName(string FirstName = null, string LastName = null)
    { 
        var users = Enumerable.Empty<User>();
        if (FirstName != null && LastName != null)
            users = _context.Users.Where(u => (u.FirstName == FirstName) && (u.LastName == LastName));
        else if (FirstName != null)
            users = _context.Users.Where(u => u.FirstName == FirstName);
        else if (LastName != null)
            users = _context.Users.Where(u => u.LastName == LastName);

        return users;
    }
}

这是我为控制器提供的,以下是我为WebApiConfig.cs获得的 基本上我使用config.MapHttpAttributeRoutes();

    public static void Register(HttpConfiguration config)
    {
      // Web API configuration and services
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

为什么我不能通过以下方式调用api http://localhost:50861/api/users?LastName=someName&FirstName=someName

任何建议都非常感谢。或任何与此问题有关的链接也有帮助!谢谢

编辑:我刚刚更新了代码的另一部分。因为当我使用上面的api进行查询时,我得到了/ api / users的结果。

2 个答案:

答案 0 :(得分:2)

您正在定义路线

[Route("api/users/{FirstName?}/{LastName?}")]

所以您的通话应该喜欢

http://localhost:50861/api/users/someName/someName

如果您希望像查询一样通过querystring调用api,则路由的定义应类似于

[Route("api/users")]

但是它将与您的GetUsers方法冲突。所以你可以定义它的样子

[Route("api/users/byname")]

打来电话

http://localhost:50861/api/users/byname?FirstName=abc&LastName=xyz

答案 1 :(得分:2)

按如下所示修改您的GetByFirstName

[HttpGet]
[Route("api/users/name")]
public IEnumerable<User> GetByFirstName(string FirstName = null, string LastName = null)
{ 
    var users = Enumerable.Empty<User>();
    if (FirstName != null && LastName != null)
        users = _context.Users.Where(u => (u.FirstName == FirstName) && (u.LastName == LastName));
    else if (FirstName != null)
        users = _context.Users.Where(u => u.FirstName == FirstName);
    else if (LastName != null)
        users = _context.Users.Where(u => u.LastName == LastName);

    return users;
}

然后您的网址将是

GET http://localhost:50822/api/users/name?FirstName=Will&LastName=abc