为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?

Posted

技术标签:

【中文标题】为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?【英文标题】:Why is TestServer not able to find controllers when controller is in separate assembly for asp.net core app?为什么当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器? 【发布时间】:2017-04-27 23:42:05 【问题描述】:

由于某种原因,在单独的程序集中创建 ASP.NET 核心控制器时,当客户端发出请求时,TestServer 无法找到控制器动作。(导致 404 响应)这是为什么?我该如何解决它? 以下是重现的步骤。

    使用 .NET core 创建新的 ASP.NET Core WebAPI 在单独的项目中创建集成测试并将测试配置为使用 TestServer() 客户端并让测试成功运行。 现在,将控制器分离到它自己的共享库中,并重构在步骤 1 中创建的项目以使用此共享库。 重新运行包含 TestServer() 类的测试。您现在会注意到它失败了。

请参阅以下链接以创建集成测试。 Integration testing w/ ASP.NET Core

【问题讨论】:

不确定但听起来不对.. 你确定你在测试中没有一些逻辑可能正在对程序集进行一些反思。 @loneshark99,我现在找到了解决方法。有关详细信息,请参阅下面的屏幕截图。同样,这看起来像是 TestServer 的一个错误 这就是我在评论中所说的:) 你很亲密,我会给你的。 :) 有关查找具有控制器的程序集(可能是控制器工厂)的逻辑似乎封装在 Microsoft.AspNetCore.TestHost 程序集中 顺便问一下,你是为这个项目做贡献还是只是为了学习 【参考方案1】:

实际上我现在找到了解决方案,请参阅下面的差异:

听起来这可能是 TestServer() 类的错误,以及它在测试运行期间托管应用程序的方式。

这是代码行,以防您无法在图片中阅读上面的内容

.AddApplicationPart(Assembly.Load(new AssemblyName("WebApiToReproduceBug.Controllers"))); 

【讨论】:

让我开心。您还应该在 Github 上提及相关问题:github.com/aspnet/Mvc/issues/5992 你救了我的命。 请注意,如果您使用 AddControllersAsServices 在容器中注册控制器,则应首先调用 AddApplicationPart。 您不必使用 Assembly.Load,下一个 sn-p 也可以工作。 ServiceHookController 来自您要测试的程序集。 services.AddMvc() .AddApplicationPart(typeof(ServiceHookController).Assembly);【参考方案2】:

对于那些在迁移到 netcoreapp3.0 期间遇到此问题的人,我发现上述答案有效,但您可以通过更改 .csproj 文件本身中的引用来更干净地做到这一点。

在我的例子中,我更改了第一行 XML

<Project Sdk="Microsoft.NET.Sdk">

<Project Sdk="Microsoft.NET.Sdk.Web">

致谢:https://github.com/aspnet/Mvc/issues/5992#issuecomment-395408983

【讨论】:

但是如果我在我的测试项目中更改该行,我会得到一个“程序不包含适合入口点的静态'Main'方法”。 我想我是在我的 *.Web.Tests 项目中这样做的,但我不记得了。似乎需要清理解决方案,然后是重建解决方案的一类问题。 这对我有用。新的 3.1 应用程序,而不是迁移。 OMFG。我连续 2 多天一直在寻找您的答案。非常感谢!【参考方案3】:

除了乔伊回答: 无需调用 Assembly.Load() 来解决此错误。您可以使用下面的代码。 ServiceHookController 是来自单独项目的类。


public void ConfigureServices(IServiceCollection services)

    services.AddMvc()
        .AddApplicationPart(typeof(ServiceHookController).Assembly);

【讨论】:

我更喜欢这个。谢谢!【参考方案4】:

如果您遵循pre-requisites from the MS documentation,则会加载来自不同程序集的控制器。

在我的情况下,添加Microsoft.AspNetCore.Mvc.Testing NuGet package 解决了这个问题,我不需要再打电话给AddApplicationPart

【讨论】:

对 net5 有效。这应该是一个公认的答案。

以上是关于为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?的主要内容,如果未能解决你的问题,请参考以下文章

在asp.net核心控制器中,为啥ExecutionContext.SuppressFlow()会抛出“AsyncFlowControl对象必须在创建它的线程上使用”。

为啥 Asp.Net Core Kestrel 服务器向 Ngrok 返回 404 并且控制器永远不会被调用?

当控制器已经在 ASP .NET 核心中使用异步时,服务中的方法是不是也必须是异步的?

为啥当包含控制器动作的数据时日期时间值会发生变化?使用 AngularJs 和 Asp.Net Web API 2

ASP.NET 核心策略检查中缺少“aud”声明会阻止授权,但它位于 id 令牌中

如何将 slug 添加到 asp.net 核心网站中的所有链接生成?