Несколько классов запуска ядра Dotnet с внутрипроцессным хостингом - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть приложение dotnet core v.2.1, которое использует «соглашение о запуске-класс-по-окружению-имени» для использования различных классов Startup для разных сред, например, для разработки, подготовки и производства.Метод Program.Main.CreateWebHost выглядит примерно так:

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    var startupAssembly = Assembly.GetExecutingAssembly();
    var webHostBuilder = WebHost.CreateDefaultBuilder(args)
                                .UseStartup(startupAssembly.FullName);
    return webHostBuilder;
}

Однако после обновления до ядра dotnet v.2.2 (и переключение при запуске по-прежнему прекрасно работает) я хотел опробовать возможности хостинга в процессе.,При переключении на модель внутрипроцессного хостинга и локальном запуске с обновленной Visual Studio 2017 и IIS Express появляется эта ошибка при запуске приложения:

Ошибка HTTP 500.30 - Ошибка запуска процесса ANCM

Распространенные причины этой проблемы:

  • Не удалось запустить приложение
  • Приложение запустилось, но затем остановилось
  • Приложение запустилось, но выдало исключениепри запуске

Действия по устранению неполадок:

  • Проверьте журнал системных событий на наличие сообщений об ошибках
  • Включите ведение журнала сообщений процесса приложения 'stdout
  • Присоедините отладчик к процессу приложения и проверьте

Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?LinkID=2028265

Я проверил все журналы, и все, что я мог найти, это:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="IIS Express AspNetCore Module V2" /> 
    <EventID Qualifiers="0">1007</EventID> 
    <Level>2</Level> 
    <Task>0</Task> 
    <Keywords>0x80000000000000</Keywords> 
    <TimeCreated SystemTime="2018-12-14T10:37:48.327935100Z" /> 
    <EventRecordID>3693</EventRecordID> 
    <Channel>Application</Channel> 
    <Computer>[whatever]</Computer> 
    <Security /> 
  </System>
  <EventData>
    <Data>Application '/LM/W3SVC/2/ROOT' with physical root '[whatever again]' failed to load clr and managed application. CLR worker thread exited prematurely</Data> 
    <Data>Process Id: 29836.</Data> 
    <Data>File Version: 12.2.18316.0. Description: IIS ASP.NET Core Module V2 Request Handler. Commit: ce8cf65589734f82b0536c543aba5bd60d0a5a98</Data> 
  </EventData>
</Event>

Я прочитал все перенесенные в хостинг ядра dotnet 2.1 -> 2.2, какие бы статьи MSDN я ни нашел, и перепробовал кучу разных настроек, но не нашел решениячасть от использования по умолчанию:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>();

... Что не будет делать - я хочу использовать запуск-переключение вместе с внутрипроцессным хостингом.Кто-нибудь знает, как этого добиться, или есть какие-либо предложения о том, как приступить к устранению неполадок?

РЕДАКТИРОВАТЬ: Я получил нужный мне ответ от @cilerler.Для полноты, вот что происходило в моем случае:

Загрузка моих пользовательских файлов конфигурации не удалась, поскольку этот процесс зависел от вызова Directory.GetCurrentDirectory(), результат которого изменяется при переключении в-процессный хостинг.Вот мой оригинальный код для этой части (сокращенно для краткости):

var basePath = $"{Directory.GetCurrentDirectory()}\\ConfigurationFiles";
builder.SetBasePath(basePath);

builder.AddJsonFile("some.config.json", false, true);
builder.AddJsonFile($"some.config.{context.HostingEnvironment.EnvironmentName}.json", true, true);

Важнейшая часть - опять же - вызов GetCurrentDirectory(), поэтому, чтобы исправить проблему, я изменил вышеупомянутое в соответствии срекомендация в принятом ответе:

var currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var basePath = $"{currentDirectory}\\ConfigurationFiles";
builder.SetBasePath(basePath);

Подробнее см. в принятом ответе;)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

У меня была та же проблема, другая история.

Visual Studio 2017 - asp.net core mvc (sdk 2.2.104).

  1. Запустите приложение.(да, это снова выдаст сообщение об ошибке)
  2. в VS перейдите в «Настройки исключений» и включите исключения C ++, исключения CLR, исключения Win32
  3. Перезапустите процесс отладки и посмотрите, было ли выброшено исключение.

В моем случае: я зарегистрировал службу в Startup.cs через .AddScoped, где конкретный параметр serviceType был фактически абстрактным классом (забыл изменить это после рефакторинга).

Иначезайдите в Windows Event Viewer и попытайтесь найти подсказку в журналах.

0 голосов
/ 17 декабря 2018

Согласно статье aspnet-core-module говорится:

GetCurrentDirectory возвращает рабочий каталог процесса, запущенного IIS, а не каталог приложения (например, C:\ Windows \ System32 \ inetsrv для w3wp.exe).

, что означает, что загрузчик конфигурации не сможет найти appsettings.* файлов или любые другие файлы , например пользовательские настройкифайлы, которые зависят от GetCurrentDirectory вызова.Чтобы решить эту проблему в Program.cs сразу после public static void Main(string[] args) {, добавьте следующую строку

Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

Также в файле проекта (например, MyProject.csproj).) убедитесь, что у вас есть следующие строки и appsettings.* существует в выходной папке.

<ItemGroup>
  <Content Update="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <Content Update="appsettings.Development.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <Content Update="appsettings.Production.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
...