ASP.NET Core 6在从另一个.NET Core应用程序运行时为何无法发现控制器?

8
我创建了一个开箱即用的ASP.NET Core 6 Web API项目。
当我启动项目时,可以看到Swagger已加载,显示一个WeatherForecast端点,测试时可正常工作。

enter image description here

然而,当我从另一个.NET Core应用程序启动Web API项目时,控制器无法被发现。Swagger返回以下信息以供参考。手动调用端点URL也会失败。

enter image description here

在调查这个问题后,我发现如果手动注册WeatherForecast控制器,则它将在Swagger中可见,并且可以在请求时访问。

enter image description here

当从另一个.NET Core应用程序运行ASP.NET应用程序时,为什么无法发现WeatherForecast控制器?
源代码:GitHub

1
看起来它只扫描执行汇编代码,直到你指定一个跳过其他的。 - Serhii
3
这个回答涵盖了.NET Core 3;也许它仍适用于.NET 6? - Richard Deeming
@RichardDeeming 谢谢,是的,这与我用来解决问题的AddApplicationPart代码类似。令人担忧的是,这个问题在.NET Core 3中被提出,但在.NET Core 6中仍未得到妥善解决。现在我想知道这是一个有意的设计特征还是.NET Core代码中的一个错误。 - TheLegendaryCopyCoder
2个回答

7

使用 @RichardDeeming 提供的答案链接,我成功在 .Net 6 中实现了它。在 Program.cs 中找到 AddControllers 并将其修改为以下内容(将 TestServiceController 替换为目标程序集中的一个控制器):

var assembly = typeof(TestServiceController).Assembly;

builder.Services.AddControllers()
                .PartManager.ApplicationParts.Add(new AssemblyPart(assembly) );

1
非常非常感谢你,今天我为此苦思冥想了好几个小时。 - Issung

3

你尝试过这个吗:

builder.Services.AddMvc()
                .AddApplicationPart(typeof(WeatherForecastController).Assembly)
                .AddControllersAsServices();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接