針對 ASP.NET Core 專案進行疑難排解和偵錯
下列連結提供疑難排解指引:
- 針對 Azure App Service 和 IIS 上的 ASP.NET Core 進行疑難排解
- Azure App Service 與 IIS 搭配 ASP.NET Core 時的常見錯誤疑難排解
- NDC Conference (London, 2018) :診斷 ASP.NET Core應用程式中的問題
- ASP.NET 部落格:針對 ASP.NET Core效能問題進行疑難排解
.NET Core SDK 警告
已安裝 .NET Core SDK 的 32 位和 64 位版本
在 ASP.NET Core 的 [新增專案] 對話方塊中,您可能會看到下列警告:
已安裝 32 位和 64 位版本的 .NET Core SDK。 只會顯示安裝在 'C:\Program Files\dotnet\sdk\' 之 64 位版本的範本。
安裝 .NET Core SDK 的 32 位 (x86) 和 64 位 (x64) 版本時,會出現這個警告。 安裝這兩個版本的常見原因包括:
- 您原本已使用 32 位電腦下載 .NET Core SDK 安裝程式,然後複製該安裝程式,並將其安裝在 64 位電腦上。
- 另一個應用程式已安裝 32 位 .NET Core SDK。
- 下載並安裝錯誤的版本。
卸載 32 位 .NET Core SDK 以防止此警告。 從主控台>Programs 和功能>卸載或變更程式。 如果您瞭解警告發生的原因及其含意,您可以忽略警告。
.NET Core SDK 安裝在多個位置
在 ASP.NET Core 的 [新增專案] 對話方塊中,您可能會看到下列警告:
.NET Core SDK 會安裝在多個位置。 只會顯示安裝在 'C:\Program Files\dotnet\sdk\' 的 SDK 範本。
當您在 C:\Program Files\dotnet\sdk\以外的目錄中至少有一個 .NET Core SDK 安裝時,就會看到此訊息。 通常會在使用複製/貼上而非 MSI 安裝程式的電腦上部署 .NET Core SDK 時發生此情況。
卸載所有 32 位 .NET Core SDK 和執行時間,以防止此警告。 從主控台>Programs 和功能>卸載或變更程式。 如果您瞭解警告發生的原因及其含意,您可以忽略警告。
未偵測到 .NET Core SDK
在 ASP.NET Core 的 Visual Studio新增專案對話方塊中,您可能會看到下列警告:
未偵測到 .NET Core SDK,請確定它們包含在環境變數
PATH
中。執行
dotnet
命令時,警告會顯示為:找不到任何已安裝的 dotnet SDK。
當環境變數 PATH
未指向電腦上的任何 .NET Core SDK 時,會出現這些警告。 若要解決此問題:
- 安裝 .NET Core SDK。 從 .NET 下載取得最新的安裝程式。
- 確認環境變數指向
PATH
SDK 安裝位置 (C:\Program Files\dotnet\
64 位/x64 或C:\Program Files (x86)\dotnet\
32 位/x86) 。 SDK 安裝程式通常會設定PATH
。 一律在同一部電腦上安裝相同的位 SDK 和執行時間。
安裝 .NET Core 裝載套件組合之後遺失 SDK
安裝 .NET Core 裝載套件組合會在安裝 .NET Core 執行時間時修改 PATH
,以指向 .NET Core () 的 32 位 (x86) C:\Program Files (x86)\dotnet\
版本。 當使用 32 位 (x86) .NET Core 命令時,這可能會導致遺漏 SDK, () 未偵測到 .NET Coredotnet
SDK。 若要解決此問題,請移至 C:\Program Files\dotnet\
之前 PATH
的位置 C:\Program Files (x86)\dotnet\
。
從應用程式取得資料
如果應用程式能夠回應要求,您可以使用中介軟體從應用程式取得下列資料:
- 要求:方法、配置、主機、路徑基底、路徑、查詢字串、標頭
- 連線:遠端 IP 位址、遠端埠、本機 IP 位址、本機埠、用戶端憑證
- Identity:名稱、顯示名稱
- 組態設定
- 環境變數
將下列 中介軟體 程式碼放在方法的要求處理管線的開頭 Startup.Configure
。 執行中介軟體之前會先檢查環境,以確保程式碼只會在開發環境中執行。
若要取得環境,請使用下列其中一種方法:
IHostingEnvironment
將 插入 方法,Startup.Configure
並使用區域變數檢查環境。 下列範例程式碼示範此方法。將環境指派給 類別中的
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應用程式的相關資訊。