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

Posted

技术标签:

【中文标题】单独程序集中的 ASP.NET Core MVC 控制器【英文标题】:ASP.NET Core MVC controllers in separate assembly 【发布时间】:2016-10-10 02:31:11 【问题描述】:

我正在使用 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 为目标的类库。但不适用于针对完整框架、引用标准 .NET 类库的 Web 项目。

注意:这是 MVC Core,它应该支持这种没有任何MVC<=4 routing overrides 的场景。

【问题讨论】:

How to register a Controller into ASP.NET MVC when the controller class is in a different assembly?的可能重复 这是 MVC 核心 - 全新的 ASP.NET 堆栈 【参考方案1】:

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

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

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

您可能还想在这里查看:https://docs.asp.net/en/latest/migration/rc1-to-rtm.html#asp-net-5-mvc-compile-views,因为现在从 RC1 更改了控制器的发现规则。

还要记得使用 IActionResult 而不是 ActionResult!

【讨论】:

对我来说,只使用.AddApplicationPart(typeof(&lt;class in external assembly&gt;).Assembly) 就足够了。您也可以改用另一行:.AddApplicationPart(Assembly.Load("ExternalAssemblyName")); 它现在必须是设计好的,事后打开它会很可怕。 做了同样的事情但没有成功 有什么方法可以引入一个特定的控制器而不将它们全部引入另一个程序集?【参考方案2】:

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

此后此问题已得到修复,但仅在下一个版本中可用(除非您可以使用夜间构建)

【讨论】:

以上是关于单独程序集中的 ASP.NET Core MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 4. 在单独的程序集中路由控制器返回错误 404

ASP.NET MVC 和组件架构

ASP.NET Core MVC 项目无法加载程序集

集中位置的 ASP.NET Core Tag Helpers

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

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)