c#MapHttpAttitButerOutes不能对不同的参数使用相同的操作?

c#MapHttpAttitButerOutes不能对不同的参数使用相同的操作?,c#,rest,api,C#,Rest,Api,我是c#的新手,我被困在属性路径上 现在我想创建一个API来获取、发布、放置和删除用户 我不知道如何描述这个问题,我发现最熟悉的问题是我的案例的答案不正确 为什么我不能通过调用api 任何建议都将不胜感激。或任何指向此问题的链接也很有帮助!谢谢 编辑:我刚刚更新了代码的另一部分。因为当我使用上面的api进行查询时,我得到了这个/api/users的结果。您是通过 [Route("api/users/{FirstName?}/{LastName?}")] 所以你的电话应该是 http://l

我是c#的新手,我被困在属性路径上

现在我想创建一个API来获取、发布、放置和删除用户

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

为什么我不能通过调用api

任何建议都将不胜感激。或任何指向此问题的链接也很有帮助!谢谢


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

您是通过

[Route("api/users/{FirstName?}/{LastName?}")]
所以你的电话应该是

http://localhost:50861/api/users/someName/someName
如果您想像调用一样通过查询字符串调用api,那么您的路由应该定义为

[Route("api/users")]
但它将与您的GetUsers方法冲突。所以你可以定义它的相似性

[Route("api/users/byname")]
打个电话

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

你在定义路线

[Route("api/users/{FirstName?}/{LastName?}")]
所以你的电话应该是

http://localhost:50861/api/users/someName/someName
如果您想像调用一样通过查询字符串调用api,那么您的路由应该定义为

[Route("api/users")]
但它将与您的GetUsers方法冲突。所以你可以定义它的相似性

[Route("api/users/byname")]
打个电话

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

修改您的
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;
}

修改您的
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;
}

是的,你说得对。它与我的getUsers方法冲突。实际上,它不起作用,因为它只返回getusers方法的值。有什么办法可以避免吗?用null和tryThanks Abdul替换空字符串!这次有效。但是,它只有在传入这两个参数时才起作用。我将firstname和lastname设置为null作为参数,因此如果没有传入任何内容,它们将为null?例如,如果我说/api/users/byname?firstname=abc,那么lastname参数为null?我已经更新了getbyfirstname方法,以备您需要。@William您的路由是查询字符串之前的URL(URL的查询字符串部分从
开始)。似乎您希望使用查询参数,而不是路由参数。像Abdul建议的路由(
/api/users/byname
)应该可以实现这一点。@John确切地说,/api/users/byname帮助我使用GetByFirstName方法。但是,如果我说/api/users/byname/lastname=abc&firstname=def,它就可以工作了。如果我说/api/users/byname/lastname=abc,它什么也不返回。我想知道我上面的算法是否不正确。如果我将它写为public IEnumerable GetByName(string FirstName=null,string LastName=null),那么我得到的变量LastName是null?还是一个空的空间?是的,你是对的。它与我的getUsers方法冲突。实际上,它不起作用,因为它只返回getusers方法的值。有什么办法可以避免吗?用null和tryThanks Abdul替换空字符串!这次有效。但是,它只有在传入这两个参数时才起作用。我将firstname和lastname设置为null作为参数,因此如果没有传入任何内容,它们将为null?例如,如果我说/api/users/byname?firstname=abc,那么lastname参数为null?我已经更新了getbyfirstname方法,以备您需要。@William您的路由是查询字符串之前的URL(URL的查询字符串部分从
开始)。似乎您希望使用查询参数,而不是路由参数。像Abdul建议的路由(
/api/users/byname
)应该可以实现这一点。@John确切地说,/api/users/byname帮助我使用GetByFirstName方法。但是,如果我说/api/users/byname/lastname=abc&firstname=def,它就可以工作了。如果我说/api/users/byname/lastname=abc,它什么也不返回。我想知道我上面的算法是否不正确。如果我将它写为public IEnumerable GetByName(string FirstName=null,string LastName=null),那么我得到的变量LastName是null?还是一个空的空间?@William Shu,查看答案可能对你有帮助:)很高兴听到你摆脱了问题:)@William Shu,查看答案可能对你有帮助:)很高兴听到你摆脱了问题:)