这是一篇关于 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。
为了告诉 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);
// ...
}
如果您只是引用外部程序集,但没有显式使用其任何类型,则该程序集将不会被实际加载,并且 ASP.NET Core 将没有机会发现其中的控制器。
要强制加载外部程序集并解决您的问题,您可以使用类似的简单内容更新启动例程
var t = typeof(ExternalController);
其中
ExternalController
是外部库中的控制器。
我刚刚遇到了同样的问题,但使用的是 Umbraco。我找到了一个稍微不同的解决方案。
Umbraco 支持使用 IComposer 接口在外部程序集中查找和加载类。在该类中,您可以访问名为 Compose 的方法。也许这个概念也能帮到你;发出查看项目文件夹中的程序集的请求。我用它来注册 DbContext、控制器和接口。这样我就不必更新、加载/关注/干预程序或 Umbraco 本身;每个组件都是独立的。对于特定项目,您没有它或不需要它,没关系,一切都会继续......
公共类 UmbracoDependencyInjection :IComposer { public void Compose(IUmbracoBuilder 构建器) { builder.Services.AddScoped(); 建造者服务 .AddControllersWithViews() .AddApplicationPart(Assembly.GetExecutingAssembly()); } }
在此示例中,我需要添加 AddControllersWithViews,因为 AppApplicationPart 是 IMvcBuilder 上的扩展。