.Net Core 2 маршрутизиране без MVC

Опитвам се да създам просто приложение .Net Core 2 с Angular преден край и api/db бекенд.

Не искам да използвам MVC, тъй като нямам нужда от типични dot net изгледи или модели, но имам проблеми с обслужването на моите файлове 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 Web 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 и предават маршрута на ъгловия рутер?   -  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 като комбинирани Web 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 в най-горното ниво на вашия webroot (wwwroot) и той ще бъде обслужван като документ по подразбиране. Вашето приложение Angular ще поеме управлението от тяхното, взаимодействайки с API, който сте изградили в бекенда.

person pim    schedule 21.08.2018