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

boo*_*ler 34 asp.net-core-mvc asp.net-core-1.0

我正在使用ASP.NET MVC Core 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 Core Framework的Web项目,引用了一个同样面向.NET Core的类库.但不是针对完整框架的Web项目,引用标准的.NET类库.

注意:这是MVC Core,它应该支持这种情况,而不需要任何MVC <= 4路由覆盖.

Jam*_*nes 68

ASP.Net Core 1.0中仍然存在问题,现在还不确定它是否符合设计要求.最简单的解决方案是在Startup.cs/ConfigureServices中执行此操作

services.AddMvc()
  .AddApplicationPart(typeof(<class in external assembly>).Assembly)
  .AddControllersAsServices();
Run Code Online (Sandbox Code Playgroud)

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

您可能还需要在此处查看:https://docs.asp.net/en/latest/migration/rc1-to-rtm.html#asp-net-5-mvc-compile-views,因为现在更改了发现规则适用于RC1的控制器.

还记得使用IActionResult而不是ActionResult!

  • 对我来说只使用`.AddApplicationPart(typeof(<外部程序集中的类).汇编)`就足够了.您也可以使用另一行代码:`.AddApplicationPart(Assembly.Load("ExternalAssemblyName"));` (12认同)

Kir*_*lla 7

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

从那时起,这已经修复,但只能在下一个版本中使用(除非你可以使用每晚构建)