【问题标题】:ASP .NET Core Routing To Controllers in External AssemblyASP .NET Core 路由到外部程序集中的控制器
【发布时间】:2018-04-20 16:04:27
【问题描述】:

这是一篇关于 ASP.NET Core 路由的文章: https://docs.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


【解决方案1】:

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

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

var t = typeof(ExternalController);

ExternalController 是您的外部库中的控制器。

【讨论】:

  • 谢谢。我已经尝试过了,但它并没有解决我的问题。我需要在启动例程的哪一部分执行此操作,以确保应用程序域在处理路由时拥有我的程序集。
  • 奇怪,我试过了,效果很好。尝试将其添加到配置路由的 Startup.Configure() 中。
  • 我想知道我的 ASP.NET Core MVC NuGet 包是否与此有关...我使用的是 .NET Framework 支持的最新版本。
  • 您能否在 GitHub 或其他地方发布重现您的问题的最小示例?没有它,很难说为什么在您的案例中没有发现来自外部库的控制器。
  • 这是真的,但这不是故事的结局。即使加载了类型,你仍然需要调用 AddApplicationPart 否则控制器将不会被添加。
【解决方案2】:

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

https://docs.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);

  // ...
}

【讨论】:

  • 这个答案基本正确。我唯一缺少的是用我的外部程序集调用 AddApplicationPart。能否请您更新一个简单的代码示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多