Я создал проект 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>
Выберите свое приложение в IIS и щелкните ссылку обзора на правой панели. Это URL-адрес, с которым вы пытаетесь поразить его?
Да, я разместил его на порту 8081. Поэтому пытаюсь получить к нему доступ через локальный: 8081.
Он установлен как веб-сайт по умолчанию или приложение под веб-сайтом? Я пытался понять, что это может быть что-то вроде http://localhost/<application name>/api/Users
Привет, @JanithWidarshana, я вижу, у тебя есть swagger. Можете ли вы увидеть документацию по чванству при запуске API? О... Я видел это позже. Он не покажет вам чванливую документацию в производстве, поскольку она используется только в разработке. Просто возьмите его оттуда и проверьте, показывает ли он вам документацию по чванству в prod.
@Oshadha Oshadha да, у меня есть документ чванства, и его можно увидеть только в режиме разработки. В режиме разработки я это вижу. Но после того, как я разместил его в iis, я попытался получить доступ к локальный: 8081/API/пользователи, который всегда дает мне 404. И я попробовал базовое приложение с контроллером по умолчанию, созданным VS 2017. Это также дает мне 404 после размещения на IIS.
@JanithWidarshana В IIS есть концепция сайтов и приложений. Если вы не замените веб-сайт по умолчанию этим развертыванием, то он будет не на localhost:port/api/users
, а на localhost:port/<application name>/api/users
@JanithWidarshana, если вы удалите app.UseSwaggerDocumentation(); вне условия IF у вас будут документы чванства в prod. Пожалуйста, посмотрите, работает ли он в IIS. С другой стороны, вы можете просто попробовать этот локальный: 8081/API/пользователи в getpostman.com.
Все еще сталкивается с той же проблемой. Поскольку я чувствую, что это может быть проблема с IIS, это означает, что я что-то пропустил, чтобы установить или настроить.
Это проблема с использованием чванства. Наконец, я изменил способ использования чванства, и это работает. Спасибо всем за поддержку.
ниже приведены некоторые из контрольного списка, который вы можете проверить, если вы это сделали.
посмотрите, решает ли вышеизложенное проблему. вернуться для любых запросов проголосуйте и поставьте лайк, если ваша проблема решена, так что это может помочь кому-то.
Можете ли вы поделиться своим кодом контроллера, чтобы лучше понять
Обновленный вопрос с классом контроллера. Я только что создал проект веб-API .net core 2.2 из эскиза, ничего не менял и пытался его опубликовать. Это также дает ту же проблему. Может ли кто-нибудь попробовать это, пожалуйста.
Надеюсь, это поможет кому-то. Ниже приведены шаги, которые я сделал для решения этой проблемы.
Включить размещаемое веб-ядро IIS
Установите «Распространяемый пакет Visual C++ для Visual Studio 2015»
https://www.microsoft.com/en-us/download/details.aspx?id=48145
Установите «dotnet-hosting-2.2.6-win.exe»
Создайте отдельный пул приложений IIS с «No Manage Code» в версии .NET CLR.
** Обратите внимание, что порядок выполнения вышеуказанных шагов очень важен.
Эта ссылка может быть вам полезна stackoverflow.com/questions/38529123/…