Microsoft MVP성태의 닷넷 이야기
.NET Framework: 1020. .NET Core Kestrel 호스팅 - Razor 지원 추가 [링크 복사], [링크+제목 복사],
조회: 18736
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

.NET Core Kestrel 호스팅 - Razor 지원 추가

지난 글을 통해,

.NET Core Kestrel 호스팅 - Web API 추가
; https://www.sysnet.pe.kr/2/0/12505

기본 콘솔 프로젝트로 시작해 Web API까지 추가해봤는데요, 사실 Web API만 구현하는 거라면 거기서 만족할 수 있겠지만 웹 페이지까지 호스팅해야한다면 MapGet과 같은 식으로 만드는 것은,

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapGet("/", async context =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
});

현실성이 거의 없습니다. 대개의 경우 편의성을 위해 Razor 페이지를 이용한 UI 호스팅을 원할 텐데요, 이를 위한 작업은 Web API에서 변경했던 것과 동일한 방식을 사용합니다. 즉, ConfigureServices에서 Razor 지원을 추가하고, Configure에서 Razor 페이지로의 redirection을 명시하는 것입니다.

public class Startup
{
    public void ConfigureServices(IServiceCollection services) 
    {
        services.AddControllers();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            Console.WriteLine("IsDevelopment");
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapRazorPages();
        });
    }
}

테스트를 위해 간단하게 내용 구성을 한 razor 파일 하나(index.cshtml)를 추가하고,

@page

<h1>Hello, world!</h1>
<h2>The time on the server is @DateTime.Now</h2>

실행하면 될 텐데. ^^




실제로 저렇게 해보면 index.cshtml로의 redirection이 안 돼 File Not Found 오류가 발생합니다. 지난번에 추가한 Web API(ValuesController 예제)와는 달리 Razor는 기본 지정된 경로가 있기 때문입니다.

// https://learn.microsoft.com/en-us/aspnet/core/razor-pages/

/Pages/Index.cshtml         ==> / or /Index
/Pages/Contact.cshtml       ==> /Contact
/Pages/Store/Contact.cshtml ==> /Store/Contact
/Pages/Store/Index.cshtml   ==> /Store or /Store/Index

따라서, 반드시 Pages 디렉터리를 만들어 그 안에 cshtml 파일을 두고 호출을 해야만 정상적으로 endpoints.MapRazorPages() 설정에 의한 razor 페이지가 보입니다. 기타 자세한 route 정책은 다음의 문서를 참고하시고.

Razor Pages route and app conventions in ASP.NET Core
; https://learn.microsoft.com/en-us/aspnet/core/razor-pages/razor-pages-conventions




참고로 WebAPI의 경우 [Route] 특성을 이용해 경로 조정을 했던 것을 razor의 경우에는 @page로 제어할 수 있습니다.

@page "/Test2"
@model ConsoleApp1.TestModel
@{
}

<h1>TEST</h1>

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/23/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-03-12 10시05분
Liquid 템플릿과,

Liquid - Safe, customer-facing template language for flexible web apps.
; https://shopify.github.io/liquid/
; https://github.com/Shopify/liquid

유사한 방식의 텍스트 템플릿 기능을 지원하는 .NET 패키지가 있군요. ^^

scriban/scriban
; https://github.com/scriban/scriban
정성태

... [121]  122  123  124  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10934정성태4/5/201626468디버깅 기술: 77. windbg의 콜스택 함수 인자를 쉽게 확인하는 방법 [1]
10933정성태4/5/201631826.NET Framework: 571. C# - 스레드 선호도(Thread Affinity) 지정하는 방법 [8]파일 다운로드1
10932정성태4/4/201624528VC++: 96. C/C++ 식 평가 - printf("%d %d %d\n", a, a++, a);
10931정성태3/31/201624901개발 환경 구성: 283. Hyper-V 내에 구성한 Active Directory 환경의 시간 구성 방법 [3]
10930정성태3/30/201622908.NET Framework: 570. .NET 4.5부터 추가된 CLR Profiler의 실행 시 Rejit 기능
10929정성태3/29/201633260.NET Framework: 569. ServicePointManager.DefaultConnectionLimit의 역할파일 다운로드1
10928정성태3/28/201638976.NET Framework: 568. ODP.NET의 완전한 닷넷 버전 Oracle ODP.NET, Managed Driver [2]파일 다운로드1
10927정성태3/25/201627440.NET Framework: 567. System.Net.ServicePointManager의 DefaultConnectionLimit 속성 설명
10926정성태3/24/201627765.NET Framework: 566. openssl의 PKCS#1 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 [10]파일 다운로드1
10925정성태3/24/201621301.NET Framework: 565. C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 - 두 번째 이야기파일 다운로드1
10924정성태3/22/201622588오류 유형: 324. Visual Studio에서 Azure 클라우드 서비스 생성 시 Failed to initialize the PowerShell host 에러 발생
10923정성태3/21/201622929.NET Framework: 564. C# - DGML로 바이너리 트리 출력하는 방법 [1]파일 다운로드1
10922정성태3/21/201624162.NET Framework: 563. 디버깅 용도로 이진 트리의 내용을 출력하는 방법파일 다운로드1
10921정성태3/17/201627482.NET Framework: 562. BBI 인터프리터 C/C++ 코드를 C#으로 변환 [3]파일 다운로드2
10920정성태3/15/201628064.NET Framework: 561. null 처리된 객체가 왜 GC에 의해 수집되지 않을까요? [6]파일 다운로드1
10919정성태3/12/201624289.NET Framework: 560. C#에서 return할 때 명시적으로 casting한 것과 안한 것의 차이 [2]파일 다운로드1
10918정성태3/10/201621279.NET Framework: 559. WPF - ICommand.CanExecuteChanged가 해제되지 않는 문제 [2]파일 다운로드1
10917정성태3/10/201641226.NET Framework: 558. WPF - ICommand 동작 방식 [9]파일 다운로드1
10916정성태3/9/201628333.NET Framework: 557. 머신 바이트 배열로부터 역어셈블해주는 라이브러리 - Udis86 Assembler파일 다운로드2
10915정성태3/9/201623393오류 유형: 323. FatalExecutionEngineError was detected
10914정성태3/8/201626756오류 유형: 322. 정적 라이브러리 참조 시 "LNK2019 unresolved external symbol '...' referenced in function" 오류 발생파일 다운로드1
10913정성태3/7/201626559.NET Framework: 556. C#으로 다루는 MBR(Master Boot Record) [9]파일 다운로드1
10912정성태3/2/201622724.NET Framework: 555. List<T>의 Resize 메서드 구현 [2]파일 다운로드1
10911정성태2/29/201626733Math: 15. 그래프 그리기로 알아보는 뉴턴-랩슨(Newton-Raphson's method)법과 제곱근 구하기 - C#파일 다운로드1
10910정성태2/29/201628642Math: 14. HTML에서 수학 관련 기호/수식을 표현하기 위한 방법 - MathJax.js - 두 번째 이야기 [5]
10909정성태2/25/201626896기타: 56. ETW provider 목록 [3]
... [121]  122  123  124  125  126  127  128  129  130  131  132  133  134  135  ...