C# ASP.NET内核(MVC 6)中的路由消歧
当ASP.NET Core遇到命名模糊的路由时,它会变得不活跃。也就是说,应用程序将在不引发异常的情况下运行,但它将无法在任何控制器上处理任何请求。呼叫客户端接收500个响应 我将展示我是如何陷入这一困境的,我想知道如何解决它的建议 我有一个控制器,看起来像这样:C# ASP.NET内核(MVC 6)中的路由消歧,c#,rest,asp.net-web-api,asp.net-core,swagger,C#,Rest,Asp.net Web Api,Asp.net Core,Swagger,当ASP.NET Core遇到命名模糊的路由时,它会变得不活跃。也就是说,应用程序将在不引发异常的情况下运行,但它将无法在任何控制器上处理任何请求。呼叫客户端接收500个响应 我将展示我是如何陷入这一困境的,我想知道如何解决它的建议 我有一个控制器,看起来像这样: [Route("api/Subscribers/{id}/[controller]")] [Route("api/Organizations/{id}/[controller]")] publi
[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
[HttpGet("{aid}", Name = "PostalLink")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
[HttpPost]
[SwaggerResponseRemoveDefaults]
[SwaggerResponse(HttpStatusCode.Created, Type = typeof(PostalRecord))]
public async Task<IActionResult> CreateAddress(Guid id, [FromBody] PostalAddress address)
{
address.ID = Guid.NewGuid();
await createAddress.Handle(address);
return CreatedAtRoute("PostalLink", new { id = id, aid = address.ID });
}
[Route("api/{parent}/{id}/[controller]")]
[HttpGet("~/api/Subscribers/{id}/Addresses/{aid}", Name = "SubscriberLink")]
[HttpGet("~/api/Organizations/{id}/Addresses/{aid}", Name = "OrganizationLink")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
我只需更改HttpGet
即可解决此问题,因此:
[HttpGet("{aid}", Name = "PostalLink")]
我有这个:
[HttpGet("{aid}")] //the route is no longer "named"
不幸的是,删除路由名称对我来说不是一个真正的选择
解决此问题的规定方法是什么?
下面是我正在考虑的一些选择
可能性#1
理论上,ASP.NET可以自己简单地“解决”。例如,如果当前请求解析为包含单词“Subscribers”的路由,则“postalink”名称应引用该路由。这样看来,我的代码可能暴露了ASP.NET内核中的错误、缺陷或疏忽
可能性#2
我可以将两条前缀路由折叠为一条路由,如下所示:
[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
[HttpGet("{aid}", Name = "PostalLink")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
[HttpPost]
[SwaggerResponseRemoveDefaults]
[SwaggerResponse(HttpStatusCode.Created, Type = typeof(PostalRecord))]
public async Task<IActionResult> CreateAddress(Guid id, [FromBody] PostalAddress address)
{
address.ID = Guid.NewGuid();
await createAddress.Handle(address);
return CreatedAtRoute("PostalLink", new { id = id, aid = address.ID });
}
[Route("api/{parent}/{id}/[controller]")]
[HttpGet("~/api/Subscribers/{id}/Addresses/{aid}", Name = "SubscriberLink")]
[HttpGet("~/api/Organizations/{id}/Addresses/{aid}", Name = "OrganizationLink")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
这是可行的,但它破坏了我的REST文档策略。我正在使用Swashback发布端点元数据。我希望API的用户明确地看到我的“地址”API为“订阅者”或“组织”服务。当我有两个显式路由前缀时,Swagger文档可以正常工作(并且我正确验证了客户端使用的URI)
可能性#3
我可以简单地覆盖两个前缀,如下所示:
[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
[HttpGet("{aid}", Name = "PostalLink")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
[HttpPost]
[SwaggerResponseRemoveDefaults]
[SwaggerResponse(HttpStatusCode.Created, Type = typeof(PostalRecord))]
public async Task<IActionResult> CreateAddress(Guid id, [FromBody] PostalAddress address)
{
address.ID = Guid.NewGuid();
await createAddress.Handle(address);
return CreatedAtRoute("PostalLink", new { id = id, aid = address.ID });
}
[Route("api/{parent}/{id}/[controller]")]
[HttpGet("~/api/Subscribers/{id}/Addresses/{aid}", Name = "SubscriberLink")]
[HttpGet("~/api/Organizations/{id}/Addresses/{aid}", Name = "OrganizationLink")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
我使用的是DNX SDK版本1.0.0-rc1-update1。此外,我还为那些希望了解我正在尝试做的事情的更多上下文的人发布了一篇文章。如果所有操作的路由名称都相同,为什么不直接在控制器上指定它们呢
[Route("api/Subscribers/{id}/[controller]", Name = "SubscriberLink")]
[Route("api/Organizations/{id}/[controller]", Name = "OrganizationLink")]
public class AddressesController : Controller
{
[HttpGet("{aid}")]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//...implementation is irrelevant for this question.
}
}
[Route(“api/Subscribers/{id}/[controller]”,Name=“SubscriberLink”)]
[路由(“api/Organizations/{id}/[controller]”,Name=“OrganizationLink”)]
公共类地址控制器:控制器
{
[HttpGet(“{aid}”)]
公共异步任务GetAddress(Guid id,Guid辅助)
{
//…实施与此问题无关。
}
}
您研究过属性路由吗
例如
来自相关部门的样本:
在下面的示例中,app.UseMvc()
用于配置
方法,不传递任何路由
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
public IActionResult Index()
{
return View();
}
[Route("Home/About")]
public IActionResult About()
{
return View();
}
[Route("Home/Contact")]
public IActionResult Contact()
{
return View();
}
}
将对任何URL路径/
、/Home
或/Home/Index
执行Home controller.Index()
操作
我认为您正在寻找的是,您需要通过某种逻辑来约束这些路由,以取消配置them@JoeAudette我认为Swashback不知道如何将内联约束转换为正确、明确的路由文档。如果我错了,请说出来!我在问题中添加了更多示例代码,以说明我打算如何使用路由名称。它要求
{aid}
是路由模板的一部分…如果我将路由名称放在双前缀上,则不会发生这种情况。