Минимальный API ASP.NET Core 8 выдает 404 при развертывании в IIS

Когда я публикую свой проект минимального 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 со следующими настройками:

  • Версия .NET CLR v4.0.30319
  • Конвейерный режим: интегрированный

По мнению нескольких ресурсов в сети, это должно помочь. Но в моем случае я продолжаю получать ошибки 404, несмотря ни на что.

  • При доступе к /swagger -> 404 (и да, я удалил галочку IsDevelopment() :))
  • При доступе к запросу GET (/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();

Где ваш код? Ничто из вышеизложенного не поможет другим определить, нужны ли ответы 404.

Lex Li 29.06.2024 10:07

@LexLi Добавлен код.

Martijn 29.06.2024 10:21

Пробовали ли вы «Нет управляемого кода» для «версии .NET CLR» в настройках пула приложений IIS? .NET Core здесь не требует установки версии .NET — она обрабатывается по-другому.

marc_s 29.06.2024 10:41

@marc_s Да, я попробовал установить для него значение «Нет управляемого кода», но получил точно такой же результат: страницы с ошибками 404.

Martijn 29.06.2024 10:52

Ошибка 404 не найдена. IIS, у вас нет доступа к файловой системе IIS. Поместите веб-страницы на общий диск, к которому имеют доступ клиенты. Когда HTTP-соединение устанавливается с сервером IIS, у вас есть только права GUEST.

jdweng 29.06.2024 11:12

1) Значит, эти URL-адреса работают, если вы запустите dotnet run (не размещенный в IIS)? 2) Когда вы публикуете это веб-приложение в IIS, какова конфигурация IIS? Лучше отредактируйте вопрос еще раз, включив ключевые настройки в applicationHost.config в тег <sites>.

Lex Li 30.06.2024 07:38
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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();

Для чего это? Это ответ?

Lex Li 30.06.2024 06:48

Я ценю вашу связь и усилия, но CORS не имеет никакого отношения к моей проблеме.

Martijn 30.06.2024 11:12
Ответ принят как подходящий

Наконец я понял, что произошло.

Я использую 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. Вам нужно создать его самостоятельно и вставить в нужное место.

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