【发布时间】:2019-06-13 19:25:24
【问题描述】:
我有一个带有一堆现有控制器的 Core 2.2 API。我现在要做的是添加一个新控制器,它的作用类似于一个包罗万象的路由,但仅适用于该控制器(并且不会干扰现有控制器的路由)。
在我现有的控制器中,我将路由定义为控制器属性
[Route("api/[controller]")]
[ApiController]
public class SandboxController : ControllerBase
{
[HttpGet("Hello")]
public IEnumerable<string> Hello()
{
return new string[] { "Hello World", TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")).ToString()};
}
}
对于这个新的“catchall”控制器我需要它能够捕获路由到它的任何 Get、Post、Put、Delete。例如,这个控制器路由是 ../api/catchall。如果有人在哪里发帖到 ../api/catchall/some/random/unknown/route 我正试图抓住这个并将其路由到 ../api/catchall/发布。
到目前为止,我完全不成功。这是我到目前为止得到的:
在我的 Startup.cs 中
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
...
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Sandbox}/{action=Hello}/{id?}");
routes.MapRoute(
name: "catchall",
template: "{controller}/{*.}",
defaults: new { controller = "catchall", action = "post" });
});
还有包罗万象的控制器:
[Route("api/[controller]")]
[ApiController]
public class CatchallController : ControllerBase
{
[HttpPost("post", Order = int.MaxValue)]
public IActionResult Post([FromBody] string value)
{
return Content("{ \"name\":\"John Doe\", \"age\":31, \"city\":\"New York\" }", "application/json");
}
}
关于如何让它发挥作用的任何想法?
【问题讨论】:
-
你试过中间件吗?您可以编写自己的自定义中间件
-
如果我收集正确,这是针对 api 而不是整个应用程序?
-
@avin 正确,只有这个控制器。
标签: c# .net-core asp.net-web-api-routing .net-core-2.2