Контроллеры ASP.NET Core MVC в отдельной сборке

Я использую ASP.NET MVC Core RC-2. У меня есть веб-проект, ориентированный на полную платформу .NET. У меня также есть отдельная библиотека классов в решении, а также таргетинг на полную структуру.

В библиотеке классов у меня есть контроллер, отмеченный атрибутом маршрута. Я ссылался на библиотеку классов из веб-проекта. Эта сборка ссылается на пакет 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, ссылаясь на библиотеку классов, также ориентированную на .NET Core. Но не для веб-проекта, ориентированного на полную структуру, ссылаясь на стандартную библиотеку классов .NET.

Примечание: это MVC Core, который должен поддерживать такой сценарий без переопределения MVC <= 4.

Ответы

Ответ 1

Я считаю, что вы столкнулись со следующей известной проблемой в RC2. https://github.com/aspnet/Mvc/issues/4674 (обходной путь упоминается в ошибке)

Это исправлено с тех пор, но будет доступно только в следующей версии (если вы не используете ночные сборки)

Ответ 2

Все еще проблема в ASP.Net Core 1.0, не уверен, если она по дизайну сейчас. Самое простое решение - сделать это в Startup.cs/ConfigureServices

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

AddApplicationPart явно включает сборку в поисках контроллеров. Вызов AddControllersAsServices() добавит все обнаруженные контроллеры в коллекцию служб, и если вы поместите контрольную точку после этой строки и проверите "сервисы", вы увидите в коллекции все найденные типы контроллеров.

Вы также можете проверить здесь: https://docs.asp.net/en/latest/migration/rc1-to-rtm.html#asp-net-5-mvc-compile-views, поскольку правила обнаружения теперь изменены для контроллеров с RC1.

Также не забудьте использовать IActionResult вместо ActionResult!