Устранение неполадок ASP.NET Core проектовTroubleshoot ASP.NET Core projects

Автор: Рик Андерсон (Rick Anderson)By Rick Anderson

Рекомендации по устранению неполадок приведены по следующим ссылкам:The following links provide troubleshooting guidance:

Предупреждения пакет SDK для .NET Core.NET Core SDK warnings

Установлены как 32-разрядные, так и 64-разрядные версии пакет SDK для .NET CoreBoth the 32-bit and 64-bit versions of the .NET Core SDK are installed

В диалоговом окне Новый проект для ASP.NET Core может отобразиться следующее предупреждение:In the New Project dialog for ASP.NET Core, you may see the following warning:

Устанавливаются как 32-разрядные, так и 64-разрядные версии пакет SDK для .NET Core.Both 32-bit and 64-bit versions of the .NET Core SDK are installed. Отображаются только шаблоны из 64-разрядных версий, установленных на диске\C:\Program\Files DotNet SDK\.Only templates from the 64-bit versions installed at 'C:\Program Files\dotnet\sdk\' are displayed.

Это предупреждение появляется при установке 32-разрядных (x86) и 64-разрядных (x64) версий пакет SDK для .NET Core .This warning appears when both 32-bit (x86) and 64-bit (x64) versions of the .NET Core SDK are installed. Ниже перечислены распространенные причины, по которым можно установить обе версии:Common reasons both versions may be installed include:

  • Вы первоначально загрузили установщик пакет SDK для .NET Core с помощью 32-разрядного компьютера, но затем скопировали его и установили на 64-разрядном компьютере.You originally downloaded the .NET Core SDK installer using a 32-bit machine but then copied it across and installed it on a 64-bit machine.
  • 32-разрядная пакет SDK для .NET Core была установлена другим приложением.The 32-bit .NET Core SDK was installed by another application.
  • Была загружена и установлена неправильная версия.The wrong version was downloaded and installed.

Удалите 32-разрядную пакет SDK для .NET Core, чтобы предотвратить это предупреждение.Uninstall the 32-bit .NET Core SDK to prevent this warning. Удаление из панели > управленияпрограммы и компоненты > Удаление или изменение программы.Uninstall from Control Panel > Programs and Features > Uninstall or change a program. Если вы понимаете, почему возникает предупреждение и его последствия, вы можете проигнорировать это предупреждение.If you understand why the warning occurs and its implications, you can ignore the warning.

Пакет SDK для .NET Core устанавливается в нескольких расположенияхThe .NET Core SDK is installed in multiple locations

В диалоговом окне Новый проект для ASP.NET Core может отобразиться следующее предупреждение:In the New Project dialog for ASP.NET Core, you may see the following warning:

Пакет SDK для .NET Core устанавливается в нескольких расположениях.The .NET Core SDK is installed in multiple locations. Отображаются только шаблоны из пакетов SDK, установленных на сайте\"C\: Program\Files DotNet\SDK".Only templates from the SDKs installed at 'C:\Program Files\dotnet\sdk\' are displayed.

Это сообщение появляется при наличии хотя бы одной установки пакет SDK для .NET Core в каталоге за пределами C:\Program\Files DotNet\SDK\ .You see this message when you have at least one installation of the .NET Core SDK in a directory outside of C:\Program Files\dotnet\sdk\. Обычно это происходит, когда пакет SDK для .NET Core развертывается на компьютере с помощью команды копировать/вставить вместо установщика MSI.Usually this happens when the .NET Core SDK has been deployed on a machine using copy/paste instead of the MSI installer.

Удалите все 32-разрядные пакеты SDK и среды выполнения .NET Core, чтобы предотвратить это предупреждение.Uninstall all 32-bit .NET Core SDKs and runtimes to prevent this warning. Удаление из панели > управленияпрограммы и компоненты > Удаление или изменение программы.Uninstall from Control Panel > Programs and Features > Uninstall or change a program. Если вы понимаете, почему возникает предупреждение и его последствия, вы можете проигнорировать это предупреждение.If you understand why the warning occurs and its implications, you can ignore the warning.

Пакеты SDK для .NET Core не обнаруженыNo .NET Core SDKs were detected

  • В диалоговом окне Новый проект Visual Studio для ASP.NET Core может отобразиться следующее предупреждение:In the Visual Studio New Project dialog for ASP.NET Core, you may see the following warning:

    Пакеты SDK для .NET Core не обнаружены, убедитесь, что они включены в PATHпеременную среды.No .NET Core SDKs were detected, ensure they are included in the environment variable PATH.

  • При выполнении dotnet команды предупреждение выглядит следующим образом:When executing a dotnet command, the warning appears as:

    Не удалось найти установленные пакеты SDK DotNet.It was not possible to find any installed dotnet SDKs.

Эти предупреждения появляются, когда переменная PATH среды не указывает на пакеты SDK для .NET Core на компьютере.These warnings appear when the environment variable PATH doesn't point to any .NET Core SDKs on the machine. Чтобы устранить эту проблему, выполните следующие действия.To resolve this problem:

  • Установите пакет SDK для .NET Core.Install the .NET Core SDK. Получите последнюю версию установщика из скачивания .NET.Obtain the latest installer from .NET Downloads.
  • Убедитесь, что PATH переменная среды указывает на расположение, в котором установлен пакет SDK (C:\Program Files\dotnet\ для 64-разрядной версии, C:\Program Files (x86)\dotnet\ x64 или 32-разрядной версии/x86).Verify that the PATH environment variable points to the location where the SDK is installed (C:\Program Files\dotnet\ for 64-bit/x64 or C:\Program Files (x86)\dotnet\ for 32-bit/x86). Установщик пакета SDK обычно задает PATH.The SDK installer normally sets the PATH. Всегда устанавливайте одинаковые пакеты SDK и среды выполнения разрядов на одном компьютере.Always install the same bitness SDKs and runtimes on the same machine.

Отсутствует пакет SDK после установки пакета размещения .NET CoreMissing SDK after installing the .NET Core Hosting Bundle

Установка пакета размещения .NET Core изменяет PATH при установке среды выполнения .NET Core, чтобы она указывала на 32-разрядную (x86) версию .NET Core (C:\Program Files (x86)\dotnet\).Installing the .NET Core Hosting Bundle modifies the PATH when it installs the .NET Core runtime to point to the 32-bit (x86) version of .NET Core (C:\Program Files (x86)\dotnet\). Это может привести к отсутствию пакетов SDK при использовании команды .NET Core dotnet с 32-разрядной платформой (пакеты SDK для .NET Core не обнаружены).This can result in missing SDKs when the 32-bit (x86) .NET Core dotnet command is used (No .NET Core SDKs were detected). Чтобы устранить эту проблему, перейдите C:\Program Files\dotnet\ к нужной C:\Program Files (x86)\dotnet\ должности PATH.To resolve this problem, move C:\Program Files\dotnet\ to a position before C:\Program Files (x86)\dotnet\ on the PATH.

Получение данных из приложенияObtain data from an app

Если приложение может отвечать на запросы, можно получить следующие данные из приложения с помощью по промежуточного слоя:If an app is capable of responding to requests, you can obtain the following data from the app using middleware:

  • Метод – Request, схема, узел, пасбасе, путь, строка запроса, заголовкиRequest – Method, scheme, host, pathbase, path, query string, headers
  • Удаленный – IP-адрес подключения, удаленный порт, локальный IP-адрес, локальный порт, сертификат клиентаConnection – Remote IP address, remote port, local IP address, local port, client certificate
  • Имя – удостоверения, отображаемое имяIdentity – Name, display name
  • Параметры конфигурацииConfiguration settings
  • Переменные средыEnvironment variables

Поместите следующий код по промежуточного слоя в начало Startup.Configure конвейера обработки запроса метода.Place the following middleware code at the beginning of the Startup.Configure method's request processing pipeline. Среда проверяется перед выполнением по промежуточного слоя, чтобы гарантировать выполнение кода только в среде разработки.The environment is checked before the middleware is run to ensure that the code is only executed in the Development environment.

Чтобы получить среду, используйте один из следующих подходов:To obtain the environment, use either of the following approaches:

  • IHostingEnvironment ВставьтевметодипроверьтеокружениеStartup.Configure с помощью локальной переменной.Inject the IHostingEnvironment into the Startup.Configure method and check the environment with the local variable. Этот подход демонстрируется в следующем образце кода.The following sample code demonstrates this approach.

  • Назначьте среду свойству в Startup классе.Assign the environment to a property in the Startup class. Проверьте окружение с помощью свойства (например, if (Environment.IsDevelopment())).Check the environment using the property (for example, 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());
        });
    }
}