我有一个基本控制器,我的大多数api逻辑都在这里。我想标准化api动词,我希望这个基本控制器默认处理大多数请求,除非我从这个控制器继承并覆盖特定的动作。
给出这样的路径:“/ api / Socks / Get?apiKey = 1”我可以这样做:
[Route("api/[controller]/[action]")]
public class RestDbApiController : Controller
{
[HttpGet]
public virtual async Task<JsonResult> Get(string apiKey = null) {
.....
public class SockController : RestDbApiController
{}
这没关系 - 即。请求被路由到基本控制器上的操作。问题是我必须声明SockController,否则请求将不会路由。
我希望能够将所有请求路由到“/ api / xxxxx”到基本控制器,而不必声明任何其他控制器。如果有任何办法,请告诉我。
为什么我要这样做? 我正在尝试使用外部脚本定义创建一个通用控制器。根据控制器名称,它将从类似命名的脚本文件中读取脚本。我希望能够将脚本文件添加到目录中并使其工作就像那样,而无需在代码中进行任何声明
答案 0 :(得分:3)
这实际上并不可行。从技术上讲,您可以将通配符路由绑定到控制器,但这会吞下所有内容。换句话说,所有的API路由都将永远地命中此基本控制器,然后您必须在该基本控制器内基本设置自己的路由基础结构,以将请求重新路由到正确的控制器。如果不是很明显,这是一个非常糟糕的主意。
要做的最好的事情实际上是你不想做的事情:实际上定义派生控制器。虽然你可能会认为这是无关紧要的,但它实际上根本不是。它可以使您的代码自我记录。很明显,这是一个处理“袜子”的控制器,但它没有任何特定的逻辑。那是完全可以的。
答案 1 :(得分:1)
我同意@Chris,但如果您只想拥有一个控制器,则可以省略路由定义中的“控制器名称”部分。例如,以下请求将映射到下面的操作方法
/api/Socks/Get?apiKey=1
/api/OtherSocks/Get?apiKey=1
和name
参数将分别填充为“Socks”,“OtherSocks”:
public class RestDbApiController : Controller
{
[HttpGet]
[Route("api/{name}/[action]")]
public virtual async Task<JsonResult> Get(string name, string apiKey = null)
{
...
}
}