針對 ASP.NET Core 專案進行疑難排解和偵錯
下列連結提供疑難排解指引:
- 針對 Azure App Service 和 IIS 上的 ASP.NET Core 進行疑難排解
- Azure App Service 與 IIS 搭配 ASP.NET Core 時的常見錯誤疑難排解
- 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 時,就會看到此訊息。 通常,當使用複製/貼上而不是 MSI 安裝程式在電腦上部署 .NET Core SDK 時,就會發生這種情況。
請解除安裝所有 32 位元 .NET Core SDK 和執行階段,以避免出現此警告。 從 [控制台]>[程式和功能]> 解除安裝或變更程式。 如果您瞭解警告發生的原因及其含意,可以忽略該警告。
未偵測到 .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 的安裝位置 (64 位元/x64 為C:\Program Files\dotnet\
;32 位元/x86 則為C:\Program Files (x86)\dotnet\
)。 SDK 安裝程式通常會設定PATH
。 在同一部電腦上請一律安裝相同位元的 SDK 和執行階段。
安裝 .NET Core 裝載套件組合之後遺漏 SDK
安裝 .NET Core 裝載套件組合 將會在安裝 .NET Core 執行階段時修改 PATH
,以指向 32 位元 (x86) 版本的 .NET Core (C:\Program Files (x86)\dotnet\
)。 若使用 32 位元 (x86) .NET Core dotnet
命令時,這可能會導致遺漏 SDK (未偵測到 .NET Core SDK)。 要解決此問題,請在 PATH
上將 C:\Program Files\dotnet\
移至 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 應用程式偵錯的相關資訊。