Когда я публикую свой проект минимального API ASP.NET Core 8, используя следующие настройки:
Configuration: Release
Target framework: net8.0
Target runtime: Portable
в IIS на Windows Server 2012 R2 я всегда получаю ошибки 404.
Чтобы проверить, действительно ли IIS что-то обслуживает, я создал index.html
в корне веб-сайта. Когда я перехожу к этому месту, отображается index.html
. Итак, IIS что-то служит...
Я также установил пакет хостинга Windows ASP.NET Core Runtime 8.0.5.
В IIS у меня есть ApplicationPool со следующими настройками:
По мнению нескольких ресурсов в сети, это должно помочь. Но в моем случае я продолжаю получать ошибки 404, несмотря ни на что.
/swagger
-> 404 (и да, я удалил галочку IsDevelopment()
:))/foo/1
) я получаю ошибку 404.Что мне не хватает или что я могу сделать, чтобы устранить эту проблему дальше?
PS: У меня есть полный контроль над сервером Windows.
Вот мой program.cs
:
using MediatR;
using ProjectLifeApi.Application.CreateToDoItem;
using ProjectLifeApi.Application.GetToDoItems;
using ProjectLifeApi.Infrastructure;
using ProjectLifeApi.Infrastructure.CreateTask;
using ProjectLifeApi.Infrastructure.GetToDoItems;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
options.CustomSchemaIds(type => type.ToString());
});
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<SqlSaveToDoItem>());
builder.Services.AddTransient<ISaveToDoItem, SqlSaveToDoItem>();
builder.Services.AddTransient<IGetToDoItems, SqlGetToDoItems>();
var dbSettings = new DatabaseSettings();
builder.Configuration.GetSection("Database").Bind(dbSettings);
builder.Services.AddSingleton<DatabaseSettings>(dbSettings);
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
//app.UseHttpsRedirection();
app.MapPost("/todo", async (CreateToDoItemCommand command, ISender sender) =>
{
await sender.Send(command);
});
app.MapGet("/todo/{date}", async (DateOnly date, ISender sender) =>
{
return await sender.Send(new GetToDoItemsQuery { Date = date });
});
app.Run();
@LexLi Добавлен код.
Пробовали ли вы «Нет управляемого кода» для «версии .NET CLR» в настройках пула приложений IIS? .NET Core здесь не требует установки версии .NET — она обрабатывается по-другому.
@marc_s Да, я попробовал установить для него значение «Нет управляемого кода», но получил точно такой же результат: страницы с ошибками 404.
Ошибка 404 не найдена. IIS, у вас нет доступа к файловой системе IIS. Поместите веб-страницы на общий диск, к которому имеют доступ клиенты. Когда HTTP-соединение устанавливается с сервером IIS, у вас есть только права GUEST.
1) Значит, эти URL-адреса работают, если вы запустите dotnet run
(не размещенный в IIS)? 2) Когда вы публикуете это веб-приложение в IIS, какова конфигурация IIS? Лучше отредактируйте вопрос еще раз, включив ключевые настройки в applicationHost.config
в тег <sites>
.
https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-8.0введите код здесь
var MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
policy =>
{
policy.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});
// services.AddResponseCaching();
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(MyAllowSpecificOrigins);
app.UseAuthorization();
app.MapControllers();
app.Run();
Для чего это? Это ответ?
Я ценю вашу связь и усилия, но CORS не имеет никакого отношения к моей проблеме.
Наконец я понял, что произошло.
Я использую SQL (без EF!) и System.Data.SqlClient
для подключения к своей базе данных MS SQL.
По умолчанию в шаблоне проекта ASP.NET Core 8 Minimal API в файле .csproj
имеется это свойство:
<InvariantGlobalization>true</InvariantGlobalization>
Когда код нажимает sqlConnection.Open();
, вы получаете исключение:
System.NotSupportedException: Globalization Invariant Mode is not supported
Чтобы избавиться от этого исключения, вам нужно установить для вышеуказанного свойства значение false:
<InvariantGlobalization>false</InvariantGlobalization>
в .csproj
.
Теперь, когда вы это сделаете и опубликуете API в файловой системе, вы не получите web.config
!
Мое решение состояло в том, чтобы использовать файл web.config, который создается при публикации API с использованием вышеуказанного параметра со значением, установленным на true
. Таким образом создается файл web.config. После публикации и защиты файла web.config
я вернул значение InvariantGlobalization
обратно на false
.
Короче говоря: если для InvariantGlobalization
установлено значение false, публикация проекта не принесет вам web.config
. Вам нужно создать его самостоятельно и вставить в нужное место.
Где ваш код? Ничто из вышеизложенного не поможет другим определить, нужны ли ответы 404.