[英]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.