Ошибка 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

Итак, для ясности, моя полная процедура была:

Чтобы создать пакет:

  1. Создать основной сайт dotnet (я использовал Visual Studio 2017)
  2. Публиковать. Мог бы использовать функцию публикации VS, но я использовал CLR через менеджер пакетов. Команда была:

    Dotnet опубликовать -c Выпуск -r win-x64 - Сам -c достигнут

Мне пришлось использовать идентификатор win-x64, так как мы должны быть совместимы с 64-битной Windows Server 2008.

Развернуть:

  1. Создайте папку в C:\inetpub\wwwroot (например, 'testsite')
  2. Возьмите содержимое папки публикации ({root}\bin\Release\netcoreapp2.1\win-x64\publish) и скопируйте ее в новую папку "testsite" (или ваш аналог).
  3. Установите основной DotNet выполнения (не SDK!) На хост - машине.
  4. Откройте IIS. Щелкните правой кнопкой "Пулы приложений", затем "Добавить пул приложений". Создайте его с версией .NET CLR, для которой установлено "Нет управляемого кода".
  5. (моя машина не нуждалась в этом шаге, но сервер сделал это). Снова нажмите на пулы приложений. Щелкните правой кнопкой мыши новый пул приложений и выберите "Расширенные настройки". Измените удостоверение на "Сетевой сервис" (как показано на рисунке выше).
  6. Вернувшись на верхний уровень IIS, разверните "Веб-сайт по умолчанию", щелкните правой кнопкой мыши папку своего веб-сайта и выберите "Преобразовать в приложение". Выберите новый пул приложений без управляемого кода.
  7. Откройте командную строку как admin и iisreset. Это может понадобиться только в первый раз после установки среды выполнения ядра dotnet.
  8. Посетите сайт (например, http://localhost/testsite)

Ответ 4

Другой очень глупый, но вероятный вариант - приложение было развернуто в папке, отличной от той, которую вы ожидали (например, корень вашего сервера вместо подпапки) из-за ошибочных настроек развертывания.