У меня есть приложение 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);
Подробнее см. в принятом ответе;)