У меня есть приложение ASP.NET Core, которое отлично работает в IIS Express. Точно так же, если я запускаю приложение из командной строки через dotnet run, все работает гладко:
C:\Code\Sandbox\IisTestApp\IisTestApp>dotnet run
Using launch settings from C:\Code\Sandbox\IisTestApp\IisTestApp\Properties\launchSettings.json...
Hosting environment: Production
Content root path: C:\Code\Sandbox\IisTestApp\IisTestApp
Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.
Если я попытаюсь настроить таргетинг на локальный IIS, я получу следующую ошибку:
Unable to start process C:\Program Files\dotnet\dotnet.exe. The web server request failed with status code 500, Internal Server Error. The full response has been written to C:\Users{my user name}\AppData\Local\Temp\HttpFailure_08-05-50.html.
HTML-файл содержит следующую информацию:
HTTP Error 500.19 - Internal Server Error
The requested page cannot be accessed because the related configuration data for the page is invalid.
Detailed Error Information:
Module IIS Web Core
Notification BeginRequest
Handler Not yet determined
Error Code 0x8007000d
Config Error
Config File \?\C:\Code\Sandbox\IisTestApp\IisTestApp\web.config
Requested URLhttp://localhost:80/IisTestApp
Physical Path C:\Code\Sandbox\IisTestApp\IisTestApp
Logon Method Not yet determined
Logon User Not yet determined
Примечание: если это не очевидно из этого сообщения, это минимальное воспроизведение моей проблемы, а не фактическое приложение.
Большая часть того, что я вижу в Интернете, говорит о том, что код ошибки 0x8007000d указывает на то, что у меня нет компонента .NET Core Windows Server Hosting (AspNetCoreModule), но я определенно установил его:
Я также вижу его на главной странице «Модули» IIS и проверяю, что файл, на который он указывает, действительно существует:
Как ни странно, если я пытаюсь перейти на страницу модулей для этого конкретного сайта, я получаю то же сообщение об ошибке, что и веб-страница:
There was an error while performing this operation.
Details:
Filename: \?\C:\Code\Sandbox\IisTestApp\IisTestApp\web.config
Error:
Эта версия модуля хостинга (2.1.8) в целом соответствует тому, что я установил:
C:\Users\{my user name}>dotnet --list-sdks
2.1.202 [C:\Program Files\dotnet\sdk]
2.1.504 [C:\Program Files\dotnet\sdk]
C:\Users\{my user name}>dotnet --list-runtimes
Microsoft.AspNetCore.All 2.1.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
И на что нацелено мое тестовое приложение:
<Project Sdk = "Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include = "Microsoft.AspNetCore.App" />
<PackageReference Include = "Microsoft.AspNetCore.Razor.Design" Version = "2.1.2" PrivateAssets = "All" />
</ItemGroup>
</Project>
Несмотря на все это, я думаю, что проблема действительно связана с IIS и этим компонентом хостинга! Вот файл web.config (по умолчанию), созданный с помощью шаблона проекта:
<?xml version = "1.0" encoding = "utf-8"?>
<configuration>
<location path = "." inheritInChildApplications = "false">
<system.webServer>
<handlers>
<add name = "aspNetCore" path = "*" verb = "*" modules = "AspNetCoreModule" resourceType = "Unspecified" />
</handlers>
<aspNetCore processPath = "bin\IISSupport\VSIISExeLauncher.exe" arguments = "-argFile IISExeLauncherArgs.txt" stdoutLogEnabled = "false">
<environmentVariables />
</aspNetCore>
</system.webServer>
</location>
</configuration>
Примечание. Я по-прежнему получаю то же сообщение об ошибке, если жестко задаю полный путь в processPath или использую относительный путь .\.
Если я удалю узел <aspNetCore>, я получу другую ошибку:
HTTP Error 502.3 - Bad Gateway
There was a connection error while trying to route the request.
Detailed Error Information:
Module AspNetCoreModule
Notification ExecuteRequestHandler
Handler aspNetCore
Error Code 0x80070490
Requested URLhttp://localhost:80/IisTestApp
Physical Path C:\Code\Sandbox\IisTestApp\IisTestApp
Logon Method Anonymous
Logon User Anonymous
Дело в том, что на этот раз AspNetCoreModule выдает ошибку, поэтому является загружается и выполняет какой-то код.
Публикация в отдельной папке и ручная настройка сайта в IIS (вместо того, чтобы полагаться на поведение Visual Studio по умолчанию при создании веб-сайта IIS, указывающего на папку «bin») приводит к тому же сообщению об ошибке, хотя я получаю немного другое aspNetCore node в сгенерированном файле web.config:
<aspNetCore processPath = "dotnet" arguments = ".\IisTestApp.dll" stdoutLogEnabled = "true" stdoutLogFile = ".\logs\stdout">
<environmentVariables />
</aspNetCore>
Что заставляет IIS не запускать это приложение?
Я попытался переустановить .NET Core (SDK, среду выполнения и компонент хостинга), но это не помогло.
Я также заметил несколько сообщений, в которых упоминается, что установка модуля перезаписи URL-адресов для IIS исправляет эту ошибку (в частности, это: Ошибка HTTP 500.19 — ошибка IIS 7.5 0x8007000d). В моем файле web.config этот модуль не упоминается, но я попытался установить его на случай, если AspNetCoreModule использует его скрыто. В моей ситуации это не помогло.





Исключив все специфичные для приложения, о которых я (и многие полезные комментаторы, особенно Дабул) могли подумать, и просмотрев видимые настройки IIS, я прибегнул к просмотру основного файла конфигурации для IIS в целом: applicationHost.config
Согласно Введение в ApplicationHost.config, этот файл находится в %windir%\system32\inetsrv\config. Поскольку реальное приложение работает на другом компьютере в моем офисе, я сравнил их с помощью программы сравнения и обнаружил, что в моем файле конфигурации отсутствует следующий узел:
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
<configSections>
<!-- ...lots of other stuff... -->
<sectionGroup name = "system.webServer">
<!-- ...lots of other stuff... -->
<!--This "section" node for aspNetCore is the one that was missing-->
<section name = "aspNetCore" overrideModeDefault = "Allow" />
Добавление этого одного узла устранило ошибку.
Как ни странно, сам AspNetCoreModule упоминается несколько раз позже в файле. Поскольку я раньше не редактировал этот файл вручную, возможно, это была какая-то ошибка установки при первой установке AspNetCoreModule.
Я попытался использовать приведенное выше предложение, но не сработало. Итак, я переустановил Asp Net Core Runtime Hosting в режиме администратора, и мой ApplicationHost.Config был исправлен.
Установка .NET Core Hosting Bundle решила проблему для меня. Здесь — это ссылка на пакет хостинга .NET Core.
Использование .NET Core 3.1
Если вы устанавливаете Пакет хостинга Windows для .NET Core, но Аспнеткормодуле по-прежнему не отображается на вашем applicationHost.config, вы можете попробовать сделать то же, что и я, чтобы решить мою проблему, после того, как попробовали все другие решения на SO и в других местах.
Я нашел applicationHost.config на другом сервере с этими строками Аспнеткормодуле и обновил файл на сломанном сервере.
Не знаю, почему они не добавлялись при установке .NET Core.
Я добавил строку ниже в разделе <globalModules>:
<add name = "AspNetCoreModule" image = "%SystemRoot%\system32\inetsrv\aspnetcore.dll" />
А этот под <modules>:
<add name = "AspNetCoreModule" />
Надеюсь это поможет.
Я также получаю эту ошибку на ядре dotnet 3.1.
После удаления секции-обертки из web.config приложение начинает работу:
Изменился на:
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name = "aspNetCore" path = "*" verb = "*" modules = "AspNetCoreModuleV2" resourceType = "Unspecified" />
</handlers>
<aspNetCore processPath = "dotnet" arguments = ".\ContactForm.Microservice.dll" stdoutLogEnabled = "false" stdoutLogFile = ".\logs\stdout" hostingModel = "inprocess" />
</system.webServer>
</configuration>
В dot core 5.0 я решил эту ошибку, установив пакет хостинга 5.0.13.
https://dotnet.microsoft.com/en-us/download/dotnet/5.0
web.config
Как вы можете видеть в файле web.config, он использует модуль «AspNetCoreModuleV2», который я отметил желтым цветом на странице загрузки.