假设我希望允许人们为我的ASP.NET核心Web应用程序创建插件。
插件可以包括使用属性路由的端点:
[Route("[controller]")]
public class SomePlugin: ControllerBase
{
我可以加载这些插件,并将AssemblyPart
添加到Asp.net核心的部件管理器中,这样就可以了--到目前为止没有问题。
但是,假设两个插件都意外地使用了相同的路径。他们可能会意外地发生冲突--一个插件覆盖了另一个插件的路径。我不想要这个。
所以我需要做的是确保每个插件/程序集都被分配给它自己的专用URL空间,它的路由是相对的。基本上,它是自己的专用Url基路径/前缀。
因此,在上述插件的情况下,即使开发人员使用了[Route("[controller]")]
的路由属性,我也不希望它成为最终的路由。我想使它相对于那个插件特有的前缀-所以我想要生成的实际路由是[路由(“{plugin-前缀}/controller”)]。
这一策略有望保证插件不会意外地与其他路径发生冲突。
因此,希望现在我已经解释了这个问题,我的问题是,现在在asp.net核心中是否有适当的方法/机制来实现这一点?我使用的是新的端点路由机制的ASP.NET核心3.0。
发布于 2021-11-16 19:26:11
我自己还没有试过,但是你应该可以通过自定义路由约定实现这一点。就像这样:
public class PrefixConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
{
Template = // "ADD_PREFIX_BASED_ON_CONTROLLER_TYPE"?
};
}
}
}
然后将其添加到MVC约定中。
services.AddMvc(options =>
{
options.Conventions.Add(new PrefixConvention ());
});
https://stackoverflow.com/questions/56619628
复制相似问题