ASP .NET Core 路由到外部组件中的控制器

问题描述 投票:0回答:3

这是一篇关于 ASP.NET Core 路由的文章: https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

这很简单。我可以指定这样的路线:

app.UseMvc(routes =>
{
   routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

或者我可以使用如下属性标记我的控制器和操作:

[Route("api/[controller]")]
public class TestController : Controller
{
    [HttpGet("{id}")]
    public async Task<string> Get(string id)
    {
        return "test";
    }
}

但是,我尝试将控制器放入具有属性的外部库中,并从我的主服务引用该程序集,当我输入 Url 时,调用不会路由到控制器。我猜我需要告诉 ASP.NET Core 要扫描哪些程序集,但我不知道如何做。顺便说一句,我正在使用这个网址:http://localhost:5000/api/test/a

c# asp.net-mvc asp.net-core url-routing
3个回答
7
投票

为了告诉 ASP.NET Core 应在哪些程序集中查找控制器,您可以使用称为“应用程序部件”的概念。您在问题中发布的 URL 旁边有一篇相关文章:

https://learn.microsoft.com/en-us/aspnet/core/mvc/advanced/app-parts?view=aspnetcore-2.0

使用这种方法,您甚至可以根据应用程序配置文件中的设置动态加载程序集,使用根应用程序程序集未引用的程序集中的控制器。请参考下面的例子:

public void ConfigureServices(IServiceCollection services)
{
  // ...

  // load application parts from a non-referenced 'extension' assembly:
  var path = @"c:\extensions\CustomController.dll";
  var assembly = Assembly.LoadFile(path);

  services.AddMvc()
  .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
  .AddApplicationPart(assembly);

  // ...
}

0
投票

如果您只是引用外部程序集,但没有显式使用其任何类型,则该程序集将不会被实际加载,并且 ASP.NET Core 将没有机会发现其中的控制器。

要强制加载外部程序集并解决您的问题,您可以使用类似的简单内容更新启动例程

var t = typeof(ExternalController);

其中

ExternalController
是外部库中的控制器。


0
投票

我刚刚遇到了同样的问题,但使用的是 Umbraco。我找到了一个稍微不同的解决方案。

Umbraco 支持使用 IComposer 接口在外部程序集中查找和加载类。在该类中,您可以访问名为 Compose 的方法。也许这个概念也能帮到你;发出查看项目文件夹中的程序集的请求。我用它来注册 DbContext、控制器和接口。这样我就不必更新、加载/关注/干预程序或 Umbraco 本身;每个组件都是独立的。对于特定项目,您没有它或不需要它,没关系,一切都会继续......

公共类 UmbracoDependencyInjection :IComposer
{
    public void Compose(IUmbracoBuilder 构建器)
    {
        builder.Services.AddScoped();
        建造者服务
            .AddControllersWithViews()
            .AddApplicationPart(Assembly.GetExecutingAssembly());
    }
}

在此示例中,我需要添加 AddControllersWithViews,因为 AppApplicationPart 是 IMvcBuilder 上的扩展。

© www.soinside.com 2019 - 2024. All rights reserved.