Asp.net Core2 Web Api 发布到 IIS 8.5 访问时总是给出 404

Asp.net Core2 Web Api publish to IIS 8.5 always give 404 when access it

我正在做一个 Asp.Net-Core-2.0 web API 项目。我将 Web API 发布到 IIS,现在当我尝试访问它时,它会在所有控制器中给我一条 404 Error 消息。

我已经尝试 google 一切,但没有任何帮助。

如果有人需要任何信息,请在问题下发表评论,我会更新我的问题。

Program.cs 文件

public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>()
                   .Build();
    }

Startup.cs 文件

public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                   .SetBasePath(env.ContentRootPath)
                   .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                   .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                   .AddEnvironmentVariables();
            Configuration = builder.Build();

            //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.AddScoped<AuthRepository>();
            services.AddSingleton<IKapanRepository, KapanRepository>();
            services.AddSingleton<IDepartmentRepository, DepartmentRepository>();
            services.AddSingleton<IPriorityRepository, PriorityRepository>();
            services.AddSingleton<IPlanRepository, PlanRepository>();
            services.AddSingleton<IRuleTemplateRepository, RuleTemplateRepository>();
            services.AddSingleton<IDamageReportRepository, DamageReportRepository>();
            services.AddSingleton<IDashBoardRepository, DashBoardRepository>();
            services.AddSingleton<IPacketRepository, PacketRepository>();
            services.AddSingleton<IEmployeeRepository, EmployeeRepository>();
            services.AddSingleton<IPriceCalculatorRepository, PriceCalculatorRepository>();
            services.AddSingleton<ISearchRepository, SearchRepository>();
            services.AddSingleton<IUserInfoRepository, UserInfoRepository>();
            services.AddSingleton<IOverLossRepository, OverLossRepository>();

            // Container could be configured via services as well. 
            // Just be careful not to override registrations
            services.AddDbContext<ApplicationContext>(opts =>
                   opts.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

            // Add framework services.
            services.AddMvc();
            services.AddIdentity<ApplicationUser, IdentityRole>(options => {
                options.Password.RequireNonAlphanumeric = false;
            })
            .AddEntityFrameworkStores<ApiDbContext>()
            .AddDefaultTokenProviders();
            services.AddDbContext<ApiDbContext>(options => options.UseSqlServer(Settings.ConnectionStringAuth));

            // return 401 instead of redirect to login
            services.ConfigureApplicationCookie(options => {
                options.Events.OnRedirectToLogin = context => {
                    context.Response.Headers["Location"] = context.RedirectUri;
                    context.Response.StatusCode = 401;
                    return Task.CompletedTask;
                };
            });

            services.AddAuthentication(sharedOptions => {
                sharedOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
                      .AddJwtBearer(cfg => {
                          cfg.RequireHttpsMetadata = false;

                          cfg.TokenValidationParameters = new TokenValidationParameters() {
                              ValidateIssuer = true,
                              ValidateAudience = true,
                              ValidateLifetime = true,
                              ValidateIssuerSigningKey = true,
                              LifetimeValidator = CustomLifetimeValidator,
                              ValidIssuer = Configuration["TokenAuthentication:Issuer"],
                              ValidAudience = Configuration["TokenAuthentication:Audience"],
                              IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["TokenAuthentication:client_secret"]))
                          };

                          cfg.Events = new JwtBearerEvents {
                              OnAuthenticationFailed = context => {
                                  Console.WriteLine("OnAuthenticationFailed: " +
                                      context.Exception.Message);
                                  return Task.CompletedTask;
                              },
                              OnTokenValidated = context => {
                                  Console.WriteLine("OnTokenValidated: " +
                                      context.SecurityToken);
                                  return Task.CompletedTask;
                              }
                          };

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

        private bool CustomLifetimeValidator(DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
        {
            if (expires != null) {
                return expires > DateTime.UtcNow;
            }
            return false;
        }

        // 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)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseMiddleware<TokenProviderMiddleware>();
            app.UseMiddleware<RefreshTokenProviderMiddleware>();
            app.UseAuthentication();
            app.UseMvc();
        }
    }

如有任何帮助,我们将不胜感激。

是的,我知道了..

找到 Google 之后,没有任何帮助。 在完成自己的工作之后,我没有参加 Web Api 项目,而是参加了 Web Applicaton 项目并在 IIS 上发布它的工作就像一个魅力

试试吧。