【问题标题】:asp.net core web api - same url with different query parameterasp.net core web api - 具有不同查询参数的相同url
【发布时间】:2018-07-09 09:05:03
【问题描述】:

我有一个控制器类如下:

[Route("api/[controller]")]
public class ItemController : Controller
{
    //GET api/item?employId=1009
    [HttpGet]
    public List<ItemViewModel> GetByEmployId([FromQuery]long employId) {
            return new List<ItemViewModel>() {
                new ItemViewModel(),
                new ItemViewModel(),
                new ItemViewModel()
            };
    }

    // GET api/item?managerId=1009
    [HttpGet]
    public List<ItemViewModel> GetByManagerId([FromQuery]long managerId) {
        return new List<ItemViewModel>();
    }
}

对于第一个 URL (http://localhost/api/item?employId=1),web api 可以返回结果。但是对于第二个 URL (http://localhost/api/item?managerId=2),Web api 返回错误,HTTP 代码为 500。有人可以帮忙解释为什么会发生这种情况吗?谢谢。

由于某种原因,我无法使用 web api 项目进行调试。

【问题讨论】:

  • 路由只匹配路径,不匹配查询。您应该应用 RESTful 并通过 url 表示您的资源。即http://localhost/api/manager/2/item
  • 我同意曾。但这就是说,您的代码应该可以工作。 HTTP 500 表示错误。发生这种情况时您是否正在运行调试器?你看到异常了吗?此外,错误页面应该会告诉您一条错误消息。
  • @GabrielLuci 是正确的。您在此处发布的代码不会生成 500,因此唯一的假设是您发布的内容并不是您实际运行的代码的准确表示。也许你编辑太多了。无论如何,请创建一个完整、最小且可复制的样本。目前,您还没有。
  • 嗨@Tseng,感谢您的建议。目前,我们无法将 URL 更改为 RESTful 样式,因为在不久的将来会有截止日期。
  • 嗨@GabrielLuci,Web api实际上托管在Azure Service Fabric中(尽管它托管在本地集群中),出于某种原因,每次我启动Service Fabric项目(指的是Web api项目)在 Visual Studio 中使用“开始调试”时,VS 会抛出错误消息“发生致命错误......”。我们知道这个错误是由升级到 .NET Core 2.0 的项目引起的,但不知道为什么。这就是为什么我提到我无法调试它。

标签: asp.net-web-api asp.net-core asp.net-core-webapi asp.net-web-api-routing


【解决方案1】:

有点过时,但如果有人有同样的问题,可以在这里找到回复。为此,您只需将查询参数添加为函数参数。使用相同的示例。

[Route("api/[controller]")]
public class ItemController : Controller
{

    [HttpGet]
    [Route("")]
    public List<ItemViewModel> Get([FromQuery]long employId, [FromQuery] long managerId) {
            if(employId != null){
                    return new List<ItemViewModel>() {
                new ItemViewModel(),
                new ItemViewModel(),
                new ItemViewModel()
              };
             }
            if(managerId != null){

               return new List<ItemViewModel>();
           }

          return new List();

    }


}

【讨论】:

  • 这样做可以获得一些好处,其中之一是您可以为查询参数建立一些优先级。
猜你喜欢
  • 2018-11-14
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2019-01-18
  • 1970-01-01
  • 2019-08-13
相关资源
最近更新 更多