Ошибка ASP.NET Core 404 в IIS 10
У меня проблема с веб-приложением ASP.NET Core, работающим на IIS 10.
Я разрабатываю приложение с одной страницей с помощью AngularJS.
index.html загружается отлично, но запросы бэкэнд не работают с 404 кодом ошибки в IIS 10. Из Visual Studio с IIS Express он отлично работает.
Может ли кто-нибудь определить, как я могу исправить бэкэнд-запросы?
Здесь моя Program.cs
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
И вот мой метод Configure из Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseIdentity();
// Custom middleware for Angular UI-Router
app.Use(async (context, next) =>
{
if (!Path.HasExtension(context.Request.Path.Value)
&& context.Request.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest"
&& context.Request.Method.ToUpper() != "POST"
&& context.Request.Method.ToUpper() != "PUT"
&& context.Request.Method.ToUpper() != "DELETE")
{
await context.Response.WriteAsync(File.ReadAllText(env.WebRootPath + "/index.html"));
}
await next();
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "api/{controller=Home}/{action=Index}/{id?}");
});
}
Ответы
Ответ 1
Ваш код работает на моей машине с Kestrel. Хорошим шагом по устранению неполадок является выяснение, связана ли проблема с вашим приложением ASP.NET Core или с настройкой хоста IIS.
Попробуйте это из корня вашего проекта.
dotnet restore
dotnet run
Вы увидите что-то вроде этого:
Hosting environment: Production
Content root path: C:\MyApplicationPath
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
В вашем браузере перейдите к следующим двум URL-адресам. Если они не работают, то что-то не так с вашим приложением. Если они работают, что-то не так с вашим IIS-хостингом.
localhost:5000 // you will see your index.html page
localhost:5000/api // you will see your default routes output
Ответ 2
В моем случае проблема заключалась в том, что мой контроллер выбросил исключение, поэтому структура попыталась использовать страницу обработчика исключений, которая не была доступна, поэтому ошибка 404, сам контроллер выдавал 500 ошибок
Ответ 3
Для блага искателей.
Я получал 404 при использовании IIS. Я следовал правильной процедуре публикации (здесь) и развертывания, как описано здесь.
Потребовалось некоторое время, чтобы выяснить это, но в конце концов я нашел ответ, спрятанный в блоге Рика Строля.
По сути, при создании пула приложений, а также при настройке "Нет управляемого кода" мне также нужно было перейти к дополнительным настройкам и установить для идентификатора пула приложений значение "Сетевая служба". Это было хорошо под ApplicationPoolIdentity на моей машине, но не на машине, на которой я развернут.
![enter image description here]()
Итак, для ясности, моя полная процедура была:
Чтобы создать пакет:
- Создать основной сайт dotnet (я использовал Visual Studio 2017)
-
Публиковать. Мог бы использовать функцию публикации VS, но я использовал CLR через менеджер пакетов. Команда была:
Dotnet опубликовать -c Выпуск -r win-x64 - Сам -c достигнут
Мне пришлось использовать идентификатор win-x64, так как мы должны быть совместимы с 64-битной Windows Server 2008.
Развернуть:
- Создайте папку в C:\inetpub\wwwroot (например, 'testsite')
- Возьмите содержимое папки публикации ({root}\bin\Release\netcoreapp2.1\win-x64\publish) и скопируйте ее в новую папку "testsite" (или ваш аналог).
- Установите основной DotNet выполнения (не SDK!) На хост - машине.
- Откройте IIS. Щелкните правой кнопкой "Пулы приложений", затем "Добавить пул приложений". Создайте его с версией .NET CLR, для которой установлено "Нет управляемого кода".
- (моя машина не нуждалась в этом шаге, но сервер сделал это). Снова нажмите на пулы приложений. Щелкните правой кнопкой мыши новый пул приложений и выберите "Расширенные настройки". Измените удостоверение на "Сетевой сервис" (как показано на рисунке выше).
- Вернувшись на верхний уровень IIS, разверните "Веб-сайт по умолчанию", щелкните правой кнопкой мыши папку своего веб-сайта и выберите "Преобразовать в приложение". Выберите новый пул приложений без управляемого кода.
- Откройте командную строку как admin и
iisreset
. Это может понадобиться только в первый раз после установки среды выполнения ядра dotnet. - Посетите сайт (например, http://localhost/testsite)
Ответ 4
Другой очень глупый, но вероятный вариант - приложение было развернуто в папке, отличной от той, которую вы ожидали (например, корень вашего сервера вместо подпапки) из-за ошибочных настроек развертывания.