【问题标题】:Asp.net core web api - extending attribute route generationAsp.net core web api - 扩展属性路由生成
【发布时间】:2019-10-30 08:35:11
【问题描述】:

假设我想允许人们为我的 ASP.NET Core Web API 应用程序创建插件。

插件可以包含使用属性路由的端点:

    [Route("[controller]")]
    public class SomePlugin: ControllerBase
    {

我可以加载这些插件并将AssemblyPart's 添加到 Asp.net 核心的部件管理器中,这些东西都可以工作 - 到目前为止没有问题。

但是假设两个插件都意外地使用了相同的路由。他们有可能会意外地相互冲突——一个插件覆盖了另一个插件的路由。我不想要这个。

所以我需要做的是确保每个插件/程序集都被分配了它自己的专用 URL 空间,它的路由在其中是相对的。基本上它是自己专用的 Url 基本路径/前缀。

因此,在上述插件的情况下,即使开发人员使用了[Route("[controller]")] 的 Route 属性 - 我不希望它成为最终路由。我想让它相对于该插件唯一的前缀 - 所以我想要生成的实际路由将是 [Route("{plugin-prefix}/[controller]")]。

此政策有望保证插件不会意外地与其他路由发生冲突。

希望现在我已经解释了这个问题,我的问题是,现在是否有适当的方法/机制可以在 asp.net 核心中实现这一点?我正在使用带有新端点路由机制的 ASP.NET Core 3.0。

【问题讨论】:

  • 你有进步吗?我也在研究这个。
  • 不,这方面没有进展,我暂时搁置了。如果您进一步了解,请告诉我!

标签: asp.net-core asp.net-core-webapi asp.net-core-3.0


【解决方案1】:

我自己没有尝试过,但你应该可以通过 Custom routing convention。像这样:

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 ());
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 2021-09-04
    • 2017-08-16
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2013-07-10
    相关资源
    最近更新 更多