繁体   English   中英

使用不是 Web API 中的 id 的第二个参数路由到 controller

[英]Routing to controller with a second parameter that's not an id in Web API

1)我有一个 controller 前缀路线即公司。

当我调用以下操作时:

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
    ...
}

它返回公司列表,但现在我想声明第二个操作,我可以在其中返回公司列表及其前 3 个联系人,所以我想我会使用以下路线定义我的新操作:

[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
    ...
}

由于RoutePrefix被定义为

[RoutePrefix("Companies")]

我以为我可以使用以下命令调用我的 uri:

http://localhost/companies/contacts

但这似乎总是打击 GetCompanies 行动。

我只能假设我的路线没有被处理,但我不确定如何添加这样一个特定的操作

config.Routes.MapHttpRoute(....)

2)另外,定义第二条路线 rest 的方法是否符合标准,还是使用查询字符串参数来指示我想包含用户更好?

../公司../公司/用户

谢谢

更新-1:

这就是我在 WebApiConfig.cs 中的 Register function 已经尝试添加特定路线但没有运气:

config.MapHttpAttributeRoutes();

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

config.Routes.MapHttpRoute(
    name: "OrganizationWithUsers",
    routeTemplate: "api/Companies/Contacts"
);

更新2:

如果我删除:

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
    ...
}

它调用

[HttpGet]
[Route("Contacts")
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
    ...
}

但我收到错误The value 'contacts' is not valid for Guid. .

嗯...我可以看到发生了什么,但我不知道如何解决它。 我还有一个 GetCompany,它的定义如下:

[HttpGet]
public async Task<IHttpActionResult> GetCompany(Guid id)

所以看起来这个现在正在被击中,这是有道理的。

我试图在这个上添加一个约束并将我的路由添加回 GetCompaniesAndContacts 并删除 RoutePrefix 但它不起作用。

我认为存在冲突,因为我有 2 个相同的 get 并且无法区分这 2 个。

更新3:

这是所要求的完整定义:

[RoutePrefix("Companies")]
[ValidationModel]
[ApiException]
public class CompaniesController : BaseController
{
    ...
    [HttpGet]
    public async Task<IHttpActionResult> GetCompanies(
        int pageIndex,
        int pageSize,
        string orderBy,
        OrderByDirection orderByDirection,
        string filters)
    {
       ...
    }

    [HttpGet]
    [Route("Contacts")]
    public async Task<IHttpActionResult> GetCompaniesAndContacts(
        int pageIndex,
        int pageSize,
        string orderBy,
        OrderByDirection orderByDirection,
        string filters)
    {
       ...
    } 
}

创建一个新项目,我能够创建一个新的 controller,编写 2 个 GET 操作

public class TestController : Controller
{
    public string GetCompanies()
    {
        return "Companies";
    }

    public string GetCompaniesAndContacts()
    {
        return "Companies & Contacts";
    }
}

以下 2 个 URL 按预期工作

无需更改路线。

现在我看到您正在尝试设置特定的路由模式,所以我将代码更改为...

routes.MapRoute(
    name: "Company Routes",
    url: "api/Companies/{action}/{id}",
    defaults: new {controller = "Test", action = "GetCompanies", id = UrlParameter.Optional}
);

我在默认路由之前添加了上述路由,然后以下 URL 按预期工作

我建议您在一个新的临时项目中使用路由,然后将理解应用到您的用例中。

我发现了我的问题,它归结为路由前缀!

我把它定义为:

[RoutePrefix("companies")]
public class CompaniesController : BaseController
{
}

当它应该被定义为:

[RoutePrefix("api/companies")]
public class CompaniesController : BaseController
{
}

一旦按上述方式定义,我就可以使用

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(
    int pageIndex,
    int pageSize,
    string orderBy,
    OrderByDirection orderByDirection,
    string filters)
{
...
}

要求公司只使用

http://localhost/api/companies?PageIndex...

并要求公司和主要联系人,我只需要用“联系人”定义新路线。

[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(
    int pageIndex,
    int pageSize,
    string orderBy,
    OrderByDirection orderByDirection,
    string filters)
{
...
}   

我现在可以这样称呼它:

http://localhost/api/companies/contacts?PageIndex...

愚蠢的错误,但仍然希望这对其他人有所帮助。 不要忘记在前缀路由中包含您的api !!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM