我正在尝试将Core 2.1 WebAPI项目分成两个,以便我们可以根据情况公开两个不同的API。简化了,我们有一个API,我们希望所有的只读(GET)请求都在一个API中,而整个请求都在另一个API中(“ admin” API)。在项目中启用了Swagger。
我复制了该项目,重命名了一个(命名空间等)并将其添加到同一解决方案中,然后注释掉了只读项目中的所有非GET控制器方法,并注释了管理员中的所有GET方法。项目。然后,我在admin项目中添加了对只读项目的引用。
运行只读项目,打开页面,只是GET。运行admin项目在swagger页面上给出了500。有趣的是,在调试过程中,我发现从admin项目中删除了所有控制器,从只读项目中删除了底层API,并完全发挥了功能-这不是我所期望的,对于任何不期望的人来说都是潜在的安全问题它。
但是,我然后又添加了一个控制器,并将其更改为从只读控制器之一下降的值,从而覆盖了祖先构造函数等。它仍然给出了500。
基类:
namespace InfoFeed.WebAPI.Features.Account
{
/// <summary>
/// Handle user account related tasks
/// </summary>
[Authorize]
[Produces("application/json")]
[Route("api/account")]
public class AccountController : Controller
{
private readonly ILogger _log;
protected readonly IMediator _mediator;
public AccountController(ILogger<AccountController> log,
IMediator mediator)
{
_log = log;
_mediator = mediator;
}
后代:
namespace InfoFeedAdmin.WebAPI.Features.Account
{
/// <summary>
/// Handle user account related tasks
/// </summary>
[Authorize]
[Produces("application/json")]
[Route("api/account")]
public class AccountAdminController
: InfoFeed.WebAPI.Features.Account.AccountController
{
public AccountAdminController(ILogger<AccountAdminController> log,
IMediator mediator)
: base(log, mediator)
{
}
我认为该路线可能会引起冲突,因此我尝试将其更改为[Route(“ api / admin / account”)]-只要没有冲突方法签名,此方法就起作用。但是,这意味着有两组路由暴露给相同的基础控制器方法。
POST /api/account/signin
GET /api/account/signout
POST /api/admin/account/signin
GET /api/admin/account/signout
有人知道我如何(可能有选择地)隐藏祖先类中的路由,以便只有我选择从后代类中暴露的路由才可见/可访问?
欢呼
答案 0 :(得分:3)
默认情况下,MVC将搜索依赖关系树并找到控制器(甚至在其他程序集中)。
您可以使用application parts
来避免在特定的组件或位置中查找控制器。
如果您的程序集包含不想使用的控制器,请将其从ApplicationPartManager
中删除:
services.AddMvc()
.ConfigureApplicationPartManager(apm =>
{
var dependentLibrary = apm.ApplicationParts
.FirstOrDefault(part => part.Name == "DependentLibrary");
if (dependentLibrary != null)
{
p.ApplicationParts.Remove(dependentLibrary);
}
})
来源:https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/app-parts?view=aspnetcore-2.1