ASP.NET Core MVC控制器在单独的程序集中

ASP.NET Core MVC controllers in separate assembly

我使用的是ASP.NET MVC核心RC-2。我有一个面向完整.NET框架的Web项目。我在解决方案中也有一个单独的类库,也以完整的框架为目标。

在类库中,我有一个用路由属性标记的控制器。我引用了Web项目中的类库。此程序集引用nuget包Microsoft.AspNetCore.Mvc v. 1.0.0-rc2-final

据我所知,这个外部控制器将被自动发现,例如http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/

但是,这对我来说不起作用——我浏览到路由的URL,得到一个空白页,它不会碰到我的控制器断点。

有什么办法让这个工作吗?

有趣的是,它似乎确实适用于以.NET核心框架为目标的Web项目,引用的类库也以.NET核心为目标。但不适用于以完整框架为目标、引用标准.NET类库的Web项目。

注意:这是MVC核心,它应该支持这种场景,而不需要任何MVC<=4路由覆盖。


仍然是ASP.NET核心1.0中的一个问题,不确定现在是否按设计进行。最简单的解决方案是在startup.cs/configureservices中执行此操作。

1
2
3
services.AddMvc()
  .AddApplicationPart(typeof(<class in external assembly>).Assembly)
  .AddControllersAsServices();

AddApplicationPart在搜索控制器时显式包含程序集。对addControllerSasServices()的调用将把所有发现的控制器添加到服务集合中,如果在此行后放置一个断点并检查"services",您将在集合中看到所有找到的控制器类型。

您可能还需要检查以下内容:https://docs.asp.net/en/latest/migration/rc1 to rtm.html asp-net-5-mvc-compile-views,因为现在已从rc1更改控制器的发现规则。

还请记住使用IActionResult而不是ActionResult!


我相信你在RC2中遇到了以下已知问题。https://github.com/aspnet/mvc/issues/4674(bug中提到了解决方法)

这从那时起就已经被修复了,但只在下一个版本中可用(除非您可以使用夜间构建)