web-dev-qa-db-ja.com

インプロセスホスティングを使用したDotnet Coreの複数のスタートアップクラス

私は、「startup-class-by-environment-name-convention」を利用してさまざまな環境に異なるStartupクラスを使用するdotnet core v.2.1アプリケーションを持っています。開発、ステージング、およびプロダクション。 _Program.Main.CreateWebHost_メソッドは次のようになります。

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

ただし、dotnet core v.2.2にアップグレードした後(および起動時の切り替えは引き続き機能します)、インプロセスホスティング機能を試してみました。インプロセスホスティングモデルに切り替え、Visual Studio 2017を更新してローカルで実行し、IIS Expressとすると、アプリケーションの実行中にこのエラーが発生します。

HTTPエラー500.30-ANCMインプロセス開始エラー

この問題の一般的な原因:

  • アプリケーションを開始できませんでした
  • アプリケーションは起動したが停止した
  • アプリケーションは起動しましたが、起動中に例外をスローしました

トラブルシューティング手順:

  • システムイベントログでエラーメッセージを確認します
  • アプリケーションプロセスの標準出力メッセージのログを有効にする
  • デバッガーをアプリケーションプロセスに接続して検査する

詳細については、次を参照してください: 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 core in-hosting migrate 2.1-> 2.2をすべてのMSDN記事で読み、さまざまなセットアップを試しましたが、デフォルトを使用する以外に解決策は見つかりませんでした。

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

...どちらでもない-インプロセスホスティングでスタートアップスイッチングを一緒に使用したい誰もこれを達成する方法を知っていますか、またはトラブルシューティングを進める方法について何か提案がありますか?

EDIT:@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);
_

詳細については、受け入れられた回答を参照してください;)

11
Oskar Lindberg

aspnet-core-module 記事によると

GetCurrentDirectoryは、アプリのディレクトリではなくIISによって開始されたプロセスのワーカーディレクトリを返します(たとえば、w3wp.exeのC:\ Windows\System32\inetsrv)。

つまり、構成ローダーはappsettings.*ファイル、またはGetCurrentDirectory呼び出しに依存する他のファイル(カスタム構成ファイルなど)を見つけることができません。あなたのProgram.csでそれを解決するためにpublic static void Main(string[] args) {の直後に以下の行を追加します

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

また、プロジェクトファイル(e.g。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>
9
cilerler

私は同じ問題、異なる話をしていました。

Visual Studio 2017-asp.netコアmvc​​(sdk 2.2.104)。

  1. アプリケーションを実行します。 (はい、もう一度エラーが表示されます)
  2. vSで例外設定に移動し、C++例外、CLR例外、Win32例外を有効にします
  3. デバッグの進行を再開し、例外がスローされるかどうかを確認します。

私の場合:具体的なserviceTypeパラメーターが実際には抽象クラスであった(リファクタリング後にこれを変更するのを忘れていた).AddScoped経由でStartup.csにサービスを登録しました。

それ以外の場合は、Windowsイベントビューアにアクセスして、ログで手がかりを見つけてください。

0
juFo