为啥当控制器位于 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