針對 ASP.NET Core 專案進行疑難排解和偵錯

作者:Rick Anderson

下列連結提供疑難排解指引:

.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 應用程式偵錯的相關資訊。