.Net Core 2 Маршрутизация без MVC

Я пытаюсь создать простое приложение .Net Core 2 с интерфейсом Angular и сервером api / db.

Я не хочу использовать MVC, поскольку мне не нужны типичные точечные сетевые представления или модели, но у меня возникают проблемы с обслуживанием моих файлов index.html, а также с маршрутизацией вызовов api на мой контроллер.

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

Просто вот мои требования снова:

  1. Serve my angular index.html file when routing to the root (let angular handle the rest of the routes there)
    1. Route my /api routes to be routed to a c# dot net controller
    2. Не использовать MVC

Спасибо!


person blubberbo    schedule 17.10.2017    source источник
comment
В .NET Core 2.0 веб-API и MVC были объединены в единую платформу под названием MVC. Итак, вы фактически ищете MVC, если хотите добавить маршруты API.   -  person NightOwl888    schedule 17.10.2017
comment
Я понимаю. Не могли бы вы дать мне пример того, как просто обслуживать html-файл? Например, чтобы обслуживать мое приложение angular, я не хочу направлять действие контроллера и возвращать представление. Мне не нужно действие контроллера, верно?   -  person blubberbo    schedule 17.10.2017
comment
Я считаю, что все, что вам нужно, это app.UseStaticFiles().   -  person NightOwl888    schedule 17.10.2017
comment
Но каков код в маршрутах, чтобы иметь такие маршруты, как ... com / и ... com / about /, обслуживать файл index.html и передавать маршрут маршрутизатору angular?   -  person blubberbo    schedule 17.10.2017


Ответы (2)


Вы можете использовать промежуточное ПО UseRouter() для явного сопоставления маршрутов непосредственно как часть конвейера конфигурации вашего приложения.

Например, следующее создает настраиваемый маршрут для обработки запросов Lets Encrypt, которые по умолчанию не работают, если включена какая-либо другая маршрутизация. Следующий код входит в Configure() метод серверного класса Startup:

        // Handle Lets Encrypt Route(before MVC processing!)
        app.UseRouter(r =>
        {
            r.MapGet(".well-known/acme-challenge/{id}", async (request, response, routeData) =>
            {
                var id = routeData.Values["id"] as string;
                var file = Path.Combine(env.WebRootPath, ".well-known", "acme-challenge", id);
                await response.SendFileAsync(file);
            });
        });

Это существенно упрощает создание простых сценариев маршрутизации или пересылку запросов другим обработчикам.

Обратите внимание, что это необработанный интерфейс, который не включает никакой обработки ввода или вывода, кроме необработанной семантики запроса / ответа.

Если вы что-то делаете с данными в стиле API, я бы все равно рекомендовал использовать MVC и контроллеры, которые обрабатывают все виды вещей, которые в противном случае вам пришлось бы создавать самостоятельно. В Core API и MVC используют один и тот же конвейер контроллера, поэтому вы можете думать о MVC как о веб-API и MVC вместе.

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

person Rick Strahl    schedule 18.10.2017
comment
Так что мне все равно нужно просто использовать метод контроллера и вместо этого вернуть свой index.html, правильно? - person blubberbo; 18.10.2017
comment
Для index.html и подобных элементов используйте промежуточное ПО StaticFile. Он будет обрабатывать некоторый минимальный уровень кеширования и правильно обрабатывать типы контента и сроки действия. - person Rick Strahl; 25.05.2021

В качестве альтернативы вы всегда можете активировать MVC с помощью .AddMvcCore() и включить средство форматирования JSON (я предполагаю, что ваш API будет JSON) с помощью .AddJsonFormatters().

В этом сценарии вы унаследуете от ControllerBase вместо Controller.

Если у вас включены статические файлы, вы можете просто поместить index.html в верхний уровень вашего корневого веб-каталога (wwwroot), и он будет использоваться как документ по умолчанию. Ваше приложение Angular заменит их, взаимодействуя с API, созданным вами на бэкэнде.

person pim    schedule 21.08.2018