我正在尝试将Core 2.1 WebAPI项目拆分为两个,以便我们可以根据具体情况公开两个不同的API。简化后,我们有一个API,我们希望在一个API中使用所有只读(GET)请求,在另一个API中使用整个集合(“admin”API)。在项目中启用了Swagger。
我复制了项目,重命名了一个(名称空间等)并将两者都添加到同一个解决方案中,然后在只读项目中注释掉了所有非GET控制器方法,并注释掉了admin项目中的所有GET方法。然后,我在admin项目中添加了对只读项目的引用。
运行只读项目,swagger页面很好,只有GET。运行管理项目在swagger页面上给出了500。有趣的是,在调试期间,我发现从管理项目中删除所有控制器,来自只读项目的底层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
有没有人知道我如何隐藏(可能有选择地)来自祖先类的路由,以便只有我选择从后代类公开的路由可见/可访问?
干杯
默认情况下,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