ASP net core MVC - запуск веб-приложения в библиотеке - PullRequest
0 голосов
/ 23 марта 2020

Мне нужно запустить веб-приложение, самостоятельно размещенное на Kestrel, из консольного проекта. Веб-приложение находится в библиотеке. У меня есть решение с двумя проектами, а именно:

  • - APP.Console.exe (консольное приложение do tnet core 3.1)
  • - APP.WebSite (a do tnet библиотека классов core 3.1)

App.Console вызывает одноэлементный метод APP.WebSite для запуска веб-приложения. Решение компилируется, но когда веб-сайт запускается, я получил более 50 ошибок, таких как эти скриншоты: enter image description here

Если я изменю APP.WebSite в консольное приложение, он будет регулярно запускаться без ошибок. Где я не прав?

EDIT1: Запустить консольное приложение:

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        Test.Start.StartApp();
        Console.ReadKey();
    }

StartApp stati c Метод:

    public static void  StartApp()
    {
        var s = Directory.GetCurrentDirectory();
        //activate web hosting here            
        var host = new WebHostBuilder()
              .UseKestrel(o =>
              {
                  o.AllowSynchronousIO = true;
                  o.ListenAnyIP(5000);
                  //o.ListenLocalhost(5000);
              })
              .UseWebRoot(s + "/Web/wwwroot")
              //.UseContentRoot(s+"/Web/wwwroot")
              .UseStartup<StartUpWeb>()
              .Build();

        host.Start();
    }

В Web / wwwroot там все клиентские файлы

EDIT2: Папки решений:

enter image description here

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Ты понял! Самой проблемой была эта строка конфигурации:

<Project Sdk="Microsoft.NET.Sdk.Web">

Спасибо, Джонатан

1 голос
/ 25 марта 2020

Я смог добиться того, чего вы хотите, используя. NET Core 3.1.1, но я должен был сделать несколько вещей.

Первый структура вашей папки неверна .

Правильная структура папок:

enter image description here

Обратите внимание, что папка wwwroot перемещена в папку с именем Web .. ТОЛЬКО wwwroot

Второй Правильный способ "преобразования" основного веб-сайта asp. net в библиотеку классов находится здесь:

enter image description here

Итак, создайте основной проект веб-приложения asp. net, затем щелкните правой кнопкой мыши свойства и измените тип вывода.

Третий начиная с проекта библиотеки классов. Если вы начинаете с. NET Базового проекта библиотеки классов, вы можете открыть файл csproj и изменить несколько вещей:

Вот так выглядит мой файл csproj сейчас:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <ApplicationIcon />
    <OutputType>Library</OutputType>
    <StartupObject />
    <EnableDefaultContentItems>true</EnableDefaultContentItems>  
  </PropertyGroup>

  <ItemGroup>
    <Content Include="Web\wwwroot\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

</Project>

Таким образом, в основном измените Sdk, OutputType, EnableDefaultContentItems и добавьте ItemGroup, чтобы принудительно скопировать все содержимое. t файлы для wwwroot.

Наконец Ваш код должен выглядеть так:

        public static void StartApp(string environment)//notice the new parameter
        {
            var s = Directory.GetCurrentDirectory();
            //activate web hosting here            
            var host = new WebHostBuilder()
                  .UseEnvironment(environment)//set the environment for debugging mostly
                  .UseKestrel(o =>
                  {
                      o.AllowSynchronousIO = true;
                      o.ListenAnyIP(5000);
                  //o.ListenLocalhost(5000);
                  })
                  .UseWebRoot(s + "\\Web\\wwwroot")//notice the correct path to client files
                  //.UseContentRoot(s+"/Web/wwwroot")
                  .UseStartup<StartUpWeb>()
                  .Build();

            host.Start();
        }

И ваша точка входа в консольное приложение:

        static void Main(string[] args)
        {
            System.Console.WriteLine("Hello World!");

            Test.Start.StartApp("Development");//pass the environment for debugging

            System.Console.ReadKey();
        }

Я сделал несколько изменений в вашем коде.

Укажите среду для отладки и загрузки файлов конфигурации и т. Д. c ....

Также укажите Web Root для поиска таких вещей, как клиентские файлы и представления (даже если они скомпилированы это все еще нуждается в сети root).

Вот результат ура !!

enter image description here

...