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

作者:Rick Anderson

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

.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 (x64) 版本的 32 位 (x86) 和 64 位 (x64 時,會出現這個警告。 安裝這兩個版本的常見原因包括:

  • 您原本已使用 32 位電腦下載 .NET Core SDK 安裝程式,但接著將它複製到 64 位電腦上並加以安裝。
  • 另一個應用程式已安裝 32 位 .NET Core SDK。
  • 下載並安裝錯誤的版本。

卸載 32 位 .NET Core SDK 以防止此警告。 從主控台>Programs 和 Features>卸載或變更程式。 如果您瞭解警告發生的原因及其含意,您可以忽略警告。

.NET Core SDK 安裝在多個位置

在 ASP.NET Core 的 [新增專案]對話方塊中,您可能會看到下列警告:

.NET Core SDK 會安裝在多個位置。 只會顯示安裝在 'C:\Program Files\dotnet\sdk\' 上的 SDK 範本。

當您在 C:\Program Files\dotnet\sdk\外部的目錄中至少有一個 .NET Core SDK 安裝時,就會看到此訊息。 通常當 .NET Core SDK 已使用複製/貼上而不是 MSI 安裝程式部署在電腦上時,就會發生這種情況。

卸載所有 32 位 .NET Core SDK 和執行時間,以避免出現此警告。 從主控台>Programs 和 Features>卸載或變更程式。 如果您瞭解警告發生的原因及其含意,您可以忽略警告。

未偵測到 .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 (x86) 版本的 .NET Core (C:\Program Files (x86)\dotnet\) 。 當使用 32 位 (x86) .NET Core 命令時,這可能會導致遺漏 SDK, (未偵測到任何 .NET Coredotnet SDK) 。 若要解決此問題,請移至 C:\Program Files\dotnet\ 之前 C:\Program Files (x86)\dotnet\PATH 的位置。

從應用程式取得資料

如果應用程式能夠回應要求,您可以使用中介軟體從應用程式取得下列資料:

  • 要求:方法、配置、主機、路徑基底、路徑、查詢字串、標頭
  • 連線:遠端 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應用程式的相關資訊。