C# 当控制器位于asp.net核心应用程序的单独程序集中时,为什么TestServer无法找到控制器?
由于某些原因,当ASP.NET核心控制器在单独的程序集中创建时,当客户端发出请求时,TestServer无法找到控制器操作。(导致404响应)这是为什么?我怎样才能解决这个问题? 下面是复制的步骤C# 当控制器位于asp.net核心应用程序的单独程序集中时,为什么TestServer无法找到控制器?,c#,unit-testing,asp.net-web-api,asp.net-core,asp.net-core-mvc,C#,Unit Testing,Asp.net Web Api,Asp.net Core,Asp.net Core Mvc,由于某些原因,当ASP.NET核心控制器在单独的程序集中创建时,当客户端发出请求时,TestServer无法找到控制器操作。(导致404响应)这是为什么?我怎样才能解决这个问题? 下面是复制的步骤 使用.NET Core创建新的ASP.NET Core WebAPI 在单独的项目中创建集成测试,并将测试配置为使用TestServer()客户端并使测试成功运行 现在,将控制器分离到它自己的共享库中,并重构在步骤1中创建的项目以使用此共享库 重新运行包含TestServer()类的测试。你会注意到它
请参阅以下链接以创建集成测试 实际上我现在找到了一个解决方案,请参见下面的差异: 听起来这可能是TestServer()类的错误,以及它在测试运行期间如何托管应用程序 这是一行代码,以防您无法阅读上面的图片
.AddApplicationPart(Assembly.Load(new AssemblyName("WebApiToReproduceBug.Controllers")));
除了乔伊的回答: 不需要调用Assembly.Load()来解决此错误。您可以使用下面的代码
ServiceHookController
是来自单独项目的类
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddApplicationPart(typeof(ServiceHookController).Assembly);
}
如果按照以下步骤操作,将加载来自单独程序集的控制器
在我的例子中,添加解决了这个问题,我不再需要调用
AddApplicationPart
。对于那些在迁移到netcoreapp3.0
过程中遇到这种情况的人,我发现上面的答案是有效的,但是您可以通过更改.csproj文件本身中的引用来更清楚地做到这一点
在我的例子中,我更改了第一行XML
到
信用证收件人:不确定,但听起来不对。。您确定您在测试中没有一些逻辑,这些逻辑可能正在对程序集进行一些反射。@loneshark99,我现在找到了一个解决方法。有关详细信息,请参见下面的屏幕截图。同样,这看起来像TestServer的一个bug,这是我在评论中说的:)你很接近,我会告诉你的。:)关于查找具有控制器的程序集(可能是控制器工厂)的逻辑似乎封装在Microsoft.AspNetCore.TestHost程序集中。顺便说一句,你是在为这个项目做贡献还是只是为了学习我的一天。您还应该提到Github上的相关问题:您救了我的命。请注意,如果您正在容器中向AddControllerAsservices注册控制器,则应首先调用AddApplicationPart。您不必使用Assembly.Load,下一个代码段也可以工作。ServiceHookController来自要测试的程序集。services.AddMvc().AddApplicationPart(类型为(ServiceHookController.Assembly));我更喜欢这个。非常感谢。但是如果我在我的测试项目中更改了那一行,我会得到一个“程序不包含适合入口点的静态‘Main’方法”。我想我是在我的*.Web.Tests项目中这样做的,但我不记得了。这类问题似乎需要清洁解决方案,然后是重建解决方案。这对我来说很有效。新的3.1应用程序,不是迁移。是的,这个更改对我不起作用。OMFG。我连续两天都在寻找你的答案。非常感谢你!