ASP.NET Core プロジェクトのトラブルシューティングとデバッグ
作成者: Rick Anderson
次のリンクでは、トラブルシューティングのガイダンスが提供されています。
- Azure App Service および IIS での ASP.NET Core のトラブルシューティング
- ASP.NET Core を使用した Azure App Service および IIS の一般的なエラーのトラブルシューティング
- NDC カンファレンス (2018 年、ロンドン): ASP.NET Core アプリケーションでの問題を診断する
- ASP.NET ブログ: ASP.NET Core のパフォーマンスに関する問題のトラブルシューティング
.NET Core SDK の警告
32 ビットと 64 ビットの両方のバージョンの .NET Core SDK がインストールされています
ASP.NET Core の [新しいプロジェクト] ダイアログに、次の警告が表示される場合があります。
32 ビットと 64 ビットの両方のバージョンの .NET Core SDK がインストールされています。 "C:\Program Files\dotnet\sdk\" にインストールされている 64 ビット バージョンのテンプレートだけが表示されます。
この警告は、32 ビット (x86) と 64 ビット (x64) の両方のバージョンの .NET Core SDK がインストールされている場合に表示されます。 両方のバージョンがインストールされる可能性のある一般的な理由は次のとおりです。
- 最初は、32 ビットのコンピューターを使用して .NET Core SDK インストーラーをダウンロードした後、それを 64 ビットのコンピューターにコピーしてインストールしました。
- 32 ビットの .NET Core SDK が別のアプリケーションによってインストールされました。
- 正しくないバージョンがダウンロードされ、インストールされました。
この警告を回避するには、32 ビットの .NET Core SDK をアンインストールします。 [コントロール パネル]>[プログラムと機能]>[プログラムのアンインストールまたは変更] からアンインストールします。 警告が発生する理由とその影響について理解している場合は、この警告を無視できます。
.NET Core SDK は、複数の場所にインストールされます
ASP.NET Core の [新しいプロジェクト] ダイアログに、次の警告が表示される場合があります。
.NET Core SDK は、複数の場所にインストールされます。 "C:\Program Files\dotnet\sdk\" にインストールされている SDK からのテンプレートだけが表示されます。
このメッセージが表示されるのは、C:\Program Files\dotnet\sdk\ の外部にあるディレクトリに、.NET Core SDK のインストールが少なくとも 1 つ存在する場合です。 通常、これは、MSI インストーラーではなく、コピーと貼り付けを使用して、.NET Core SDK がコンピューターに展開されている場合に発生します。
この警告を回避するには、32 ビットの .NET Core SDK とランタイムをすべてアンインストールします。 [コントロール パネル]>[プログラムと機能]>[プログラムのアンインストールまたは変更] からアンインストールします。 警告が発生する理由とその影響について理解している場合は、この警告を無視できます。
.NET Core SDK が検出されませんでした
Visual Studio の ASP.NET Core 用の [新しいプロジェクト] ダイアログに、次の警告が表示される場合があります。
.NET Core SDK が検出されませんでした。それらを確実に環境変数
PATH
に含めてください。dotnet
コマンドを実行すると、次のような警告が表示されます。インストールされた dotnet SDK が見つかりませんでした。
これらの警告は、環境変数 PATH
が、コンピューター上の .NET Core SDK をポイントしていない場合に表示されます。 これを解決するには、次の手順に従います。
- .NET Core SDK をインストールします。 .NET ダウンロードから最新のインストーラーを入手します。
PATH
環境変数が、SDK がインストールされている場所 (64 ビット (x64) の場合はC:\Program Files\dotnet\
、32 ビット (x86) の場合はC:\Program Files (x86)\dotnet\
) をポイントしていることを確認します。 通常、SDK インストーラーによってPATH
が設定されます。 同じコンピューターには、常に同じビット数の SDK とランタイムをインストールします。
.NET Core ホスティング バンドルのインストール後に SDK が見つからない
.NET Core ホスティング バンドルをインストールすると、.NET Core ランタイムがインストールされるときに、32 ビット (x86) バージョンの .NET Core (C:\Program Files (x86)\dotnet\
) をポイントするように PATH
が変更されます。 これにより、32 ビット (x86) .NET Core の dotnet
コマンドが使用されているときに、SDK が見つからない可能性があります (dotnet
)。 この問題を解決するには、PATH
の C:\Program Files (x86)\dotnet\
の前の位置に C:\Program Files\dotnet\
を移動します。
アプリからデータを取得する
アプリが要求に応答できる場合は、ミドルウェアを使用してアプリから次のデータを取得できます。
- 要求 :メソッド、スキーム、ホスト、パス ベース、パス、クエリ文字列、ヘッダー
- 接続:リモート IP アドレス、リモート ポート、ローカル IP アドレス、ローカル ポート、クライアント証明書
- Identity:名前、表示名
- 構成設定
- 環境変数
次の ミドルウェア コードを Startup.Configure
メソッドの要求処理パイプラインの先頭に配置します。 この開発環境でのみコードが確実に実行されるように、環境はミドルウェアが実行される前にチェックされます。
環境を取得するには、次のいずれかの方法を使用します。
Startup.Configure
メソッドにIHostingEnvironment
を挿入し、ローカル変数を使用して環境をチェックします。 次のサンプル コードでは、この方法を示します。環境を
Startup
クラスのプロパティに割り当てます。 プロパティを使用して環境をチェックします (例:if (Environment.IsDevelopment())
)。
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IConfiguration config)
{
if (env.IsDevelopment())
{
app.Run(async (context) =>
{
var sb = new StringBuilder();
var nl = System.Environment.NewLine;
var rule = string.Concat(nl, new string('-', 40), nl);
var authSchemeProvider = app.ApplicationServices
.GetRequiredService<IAuthenticationSchemeProvider>();
sb.Append($"Request{rule}");
sb.Append($"{DateTimeOffset.Now}{nl}");
sb.Append($"{context.Request.Method} {context.Request.Path}{nl}");
sb.Append($"Scheme: {context.Request.Scheme}{nl}");
sb.Append($"Host: {context.Request.Headers["Host"]}{nl}");
sb.Append($"PathBase: {context.Request.PathBase.Value}{nl}");
sb.Append($"Path: {context.Request.Path.Value}{nl}");
sb.Append($"Query: {context.Request.QueryString.Value}{nl}{nl}");
sb.Append($"Connection{rule}");
sb.Append($"RemoteIp: {context.Connection.RemoteIpAddress}{nl}");
sb.Append($"RemotePort: {context.Connection.RemotePort}{nl}");
sb.Append($"LocalIp: {context.Connection.LocalIpAddress}{nl}");
sb.Append($"LocalPort: {context.Connection.LocalPort}{nl}");
sb.Append($"ClientCert: {context.Connection.ClientCertificate}{nl}{nl}");
sb.Append($"Identity{rule}");
sb.Append($"User: {context.User.Identity.Name}{nl}");
var scheme = await authSchemeProvider
.GetSchemeAsync(IISDefaults.AuthenticationScheme);
sb.Append($"DisplayName: {scheme?.DisplayName}{nl}{nl}");
sb.Append($"Headers{rule}");
foreach (var header in context.Request.Headers)
{
sb.Append($"{header.Key}: {header.Value}{nl}");
}
sb.Append(nl);
sb.Append($"WebSockets{rule}");
if (context.Features.Get<IHttpUpgradeFeature>() != null)
{
sb.Append($"Status: Enabled{nl}{nl}");
}
else
{
sb.Append($"Status: Disabled{nl}{nl}");
}
sb.Append($"Configuration{rule}");
foreach (var pair in config.AsEnumerable())
{
sb.Append($"{pair.Path}: {pair.Value}{nl}");
}
sb.Append(nl);
sb.Append($"Environment Variables{rule}");
var vars = System.Environment.GetEnvironmentVariables();
foreach (var key in vars.Keys.Cast<string>().OrderBy(key => key,
StringComparer.OrdinalIgnoreCase))
{
var value = vars[key];
sb.Append($"{key}: {value}{nl}");
}
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync(sb.ToString());
});
}
}
ASP.NET Core アプリをデバッグする
次のリンクでは、ASP.NET Core アプリのデバッグに関する情報を提供します。
- Linux での ASP Core のデバッグ
- SSH 経由の UNIX での .NET Core のデバッグ
- クイック スタート:Visual Studio デバッガーを使用して ASP.NET をデバッグする
- デバッグの詳細については、こちらの GitHub の問題に関するページを参照してください。
ASP.NET Core