Веб-API ASP.NET Core 2.2 дает 404 после размещения в IIS

Я создал проект ASP.Net Core 2.2 Web Api, и он работает локально без каких-либо проблем. После того, как я публикую его в файловой системе, он всегда дает мне ошибку 404. Я включил функции Windows, связанные с IIS, и веб-приложения api2 платформы asp.net работают хорошо на том же сервере.

Я включил документацию swagger и также использовал библиотеки Microsoft.AspNetCore.Authentication.

Программа.cs

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace US.BOX.AuthAPI
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

Startup.cs

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using US.BOX.AuthAPI.Extensions;

namespace US.BOX.AuthAPI
{
    public class Startup
    {
        private readonly IConfiguration _configuration;
        public Startup(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.Configure<IISOptions>(options =>
            {
                options.ForwardClientCertificate = false;
            });

            services.Configure<ApiBehaviorOptions>(options =>
            {
                options.SuppressModelStateInvalidFilter = true;
            });

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddSingleton<IAuthenticationSchemeProvider, CustomAuthenticationSchemeProvider>();

            services.AddSwaggerDocumentation();
            services.AddJwtBearerAuthentication(_configuration);

            services.AddCors();
            services.AddLogging();

            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ILogger<Startup> logger)
        {
            app.UseAuthentication();

            if (env.IsDevelopment())
            {
                app.UseSwaggerDocumentation();
            }
            else
            {
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}

appsettings.json

{
  "JWT": {
    // TODO: This should be updated for production deployment
    "SecurityKey": "sDIkdjhkalUthsaCVjsdfiskokrge",
    "Issuer": "https://{host_name}:{port}",
    "Audience": "https://{host_name}:{port}",
    "ExpirationTimeInMinutes": 60
  },
  "Logging": {
    "LogFilePath": "Logs/auth-{Date}.txt",
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

UsersController.cs

using System;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace US.BOX.AuthAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetAll()
        {
            try
            {
                return Ok("Users");
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}

После того, как я опубликовал, он генерирует следующий файл web.config

<?xml version = "1.0" encoding = "utf-8"?>
<configuration>
  <location path = "." inheritInChildApplications = "false">
    <system.webServer>
      <handlers>
        <add name = "aspNetCore" path = "*" verb = "*" modules = "AspNetCoreModuleV2" resourceType = "Unspecified" />
      </handlers>
      <aspNetCore processPath = "dotnet" arguments = ".\US.BOX.AuthAPI.dll" stdoutLogEnabled = "false" stdoutLogFile = ".\logs\stdout" hostingModel = "InProcess" />
    </system.webServer>
  </location>
</configuration>

Эта ссылка может быть вам полезна stackoverflow.com/questions/38529123/…

SUNIL DHAPPADHULE 28.05.2019 12:02

Выберите свое приложение в IIS и щелкните ссылку обзора на правой панели. Это URL-адрес, с которым вы пытаетесь поразить его?

Crowcoder 28.05.2019 13:01

Да, я разместил его на порту 8081. Поэтому пытаюсь получить к нему доступ через локальный: 8081.

Janith Widarshana 28.05.2019 13:14

Он установлен как веб-сайт по умолчанию или приложение под веб-сайтом? Я пытался понять, что это может быть что-то вроде http://localhost/<application name>/api/Users

Crowcoder 28.05.2019 14:31

Привет, @JanithWidarshana, я вижу, у тебя есть swagger. Можете ли вы увидеть документацию по чванству при запуске API? О... Я видел это позже. Он не покажет вам чванливую документацию в производстве, поскольку она используется только в разработке. Просто возьмите его оттуда и проверьте, показывает ли он вам документацию по чванству в prod.

Oshadha 28.05.2019 14:41

@Oshadha Oshadha да, у меня есть документ чванства, и его можно увидеть только в режиме разработки. В режиме разработки я это вижу. Но после того, как я разместил его в iis, я попытался получить доступ к локальный: 8081/API/пользователи, который всегда дает мне 404. И я попробовал базовое приложение с контроллером по умолчанию, созданным VS 2017. Это также дает мне 404 после размещения на IIS.

Janith Widarshana 28.05.2019 18:44

@JanithWidarshana В IIS есть концепция сайтов и приложений. Если вы не замените веб-сайт по умолчанию этим развертыванием, то он будет не на localhost:port/api/users, а на localhost:port/<application name>/api/users

Crowcoder 28.05.2019 21:09

@JanithWidarshana, если вы удалите app.UseSwaggerDocumentation(); вне условия IF у вас будут документы чванства в prod. Пожалуйста, посмотрите, работает ли он в IIS. С другой стороны, вы можете просто попробовать этот локальный: 8081/API/пользователи в getpostman.com.

Oshadha 29.05.2019 07:00

Все еще сталкивается с той же проблемой. Поскольку я чувствую, что это может быть проблема с IIS, это означает, что я что-то пропустил, чтобы установить или настроить.

Janith Widarshana 29.05.2019 07:20

Это проблема с использованием чванства. Наконец, я изменил способ использования чванства, и это работает. Спасибо всем за поддержку.

Janith Widarshana 29.05.2019 08:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
3 513
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

ниже приведены некоторые из контрольного списка, который вы можете проверить, если вы это сделали.

  1. Установите windows-hosting-bundle-installer для версии ядра dotnet для вашей ОС. вы можете скачать его ниже связь
  2. Создайте новый пул приложений в IIS для ядра dotnet, вы можете проверить приведенные ниже изображения для настроек .
  3. Нацельте любое приложение, связанное с ядром dotnet, на вновь созданный пул приложений для всего хостинга.

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

Можете ли вы поделиться своим кодом контроллера, чтобы лучше понять

Pabitro 28.05.2019 12:14

Обновленный вопрос с классом контроллера. Я только что создал проект веб-API .net core 2.2 из эскиза, ничего не менял и пытался его опубликовать. Это также дает ту же проблему. Может ли кто-нибудь попробовать это, пожалуйста.

Janith Widarshana 28.05.2019 12:20
Ответ принят как подходящий

Надеюсь, это поможет кому-то. Ниже приведены шаги, которые я сделал для решения этой проблемы.

  1. Включить размещаемое веб-ядро IIS

  2. Установите «Распространяемый пакет Visual C++ для Visual Studio 2015»

    https://www.microsoft.com/en-us/download/details.aspx?id=48145

  3. Установите «dotnet-hosting-2.2.6-win.exe»

    https://dotnet.microsoft.com/download

  4. Создайте отдельный пул приложений IIS с «No Manage Code» в версии .NET CLR.

** Обратите внимание, что порядок выполнения вышеуказанных шагов очень важен.

Другие вопросы по теме