ASP.NET Core
-
[.NET] 비동기(async, await) 방식의 메소드를 동기 방식으로 안전하게 호출하기.NET/개념 및 유용한 팁 2023. 1. 4. 23:02
가장 좋은 것은 대세에 따라 비동기 방식으로 개발하는게 좋지만, 현 회사에서 ASP.NET Core를 동기방식으로 개발해놔버린지라 좋은 도구를 개같이 쓰거나, 옛날 라이브러리의 방식을 뒤져서 쓰거나 하는 어려움이 따르고 있다. 왠만하면 참겠으나, HttpClient 놔두고 WebRequest 써야 되는 상황이 나오니 머리에 꼭지 돌 지경이다. 하여 동기방식으로 안전하게 호출하는 방식을 찾아보았다. .NET 7.0 이하 버전 기준, 비동기 함수를 .Result 프로퍼티를 통해 직접적으로 결과를 받게끔 개발하게 되면 랜덤한 상황에 Thread 교착상태가 발생하여 갑자기 동작이 멈추는 이슈가 발생할 수 있다. // 이와 같은 호출은 큰 위험이 따른다. var res = _factory.CreateClient(..
-
[.NET] ASP.NET Core 및 비동기(async, await) 프로그래밍 개발에 도움이 되는 설명 사이트.NET/개념 및 유용한 팁 2022. 12. 26. 23:01
async, await 를 통한 비동기프로그래밍은 .NET Framework 4.5부터 지원되어왔으며, Core로 넘어오면서 이제는 비동기 형식으로 개발하는게 "정상적인" 개발이라 해야할만큼 한국 빼곤 대중화 되어있다. 특히나 ASP.NET Core는 비동기 프로그래밍이 Default라 할만큼 동기식 개발과 성능차이가 나는데, 잘못쓰면 서비스가 죽을 수도 있는 문제가 있다. 일반적으로 비동기 로직에 동기방식을 섞어쓴다던가 하지만 않으면 된다고만 알았는데 보다 잘 정리된 문서가 있어 소개한다. davidfowl/AspNetCoreDiagnosticScenarios: This repository has examples of broken patterns in ASP.NET Core applications (g..
-
[ASP.NET Core] WebAPI 개발 후 OpenAPI 서비스 참조로 Client 생성시 MSB3073 오류 날 경우.NET/ASP.NET Core 2022. 3. 6. 17:30
Swagger 기반 OpenAPI 스펙에 맞춰 Web API 개발 후 Visual Studio 서비스 참조 기능을 통해 Client를 자동생성하는 작업을 테스트 하는데 아래와 같은 오류가 발생했다. 서버쪽은 이상없이 API를 사용할 수 있는 상황이고, https://editor.swagger.io/를 통해 소스코드 생성할 때도 이슈가 보이지 않아 머리 싸메고 있었는데 알고보니 서버쪽 Model 에 설정한 DataAnnotations 가 잘못되어 있었다. public class Order { [Range(0, 99_9999_9999)] // int 형인데 범위가 int 최대크기를 넘어감. 클라이언트에서 Code 생성시 오류날 수 있다. public int Id { get; set; } } long 형식으로..
-
[ASP.NET Core] 미들웨어(Middleware) 다룰때 유의사항.NET/ASP.NET Core 2021. 11. 5. 01:18
ASP.NET Core의 미들웨어는 이미지와 같이 파이프라인 개념으로 동작한다. 따라서 아래와 같은 유의사항이 있다. 1. Request Body Stream을 닫지마라 일반적으론 Reader/Writer를 이용하여 Stream을 사용하면 닫는 코드를 명시적으로 입력하거나, 자동적으로 Close시킨다. 하지만 ASP.NET Core 미들웨어에선 파이프라인 개념으로 동작하므로 다음 Middleware가 올바른 동작을 하기위해선 Stream을 닫지 말아야 한다. 아래소스코드는 모든 Request를 Log로 남기는 간략한 미들웨어 코드이다. app.Use(async (context, next) => { context.Request.EnableBuffering(); // 없으면 오류남. using var rea..
-
[ASP.NET Core] Serilog 에서 미들웨어를 이용한 모든 Request 로그 기록 설정.NET/ASP.NET Core 2021. 10. 12. 23:10
Serilog를 통해 모든 Request에서 로그기록을 하고 싶을 경우 LogContext와 미들웨어를 이용해야 한다. * 사실 Serilog는 RequestID property가 기본제공되므로 미들웨어 없이 {RequestId}를 써도 되긴한다. LogContextMiddleware.cs public class LogContextMiddleware { private readonly RequestDelegate _next; public LogContextMiddleware(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext context) { using (LogContext.PushProperty("TraceId", context..
-
[ASP.NET Core] 기본 로그를 지우고 Serilog만 나오도록 수정하는 방법.NET/ASP.NET Core 2021. 9. 22. 23:03
NET5 기준으로 ASP.NET Core 프로젝트를 생성하면 Program.cs 파일에 CreateHostBuilder() 함수가 기본 생성된다. 해당 함수에는 Host.CreateDefaultBuilder(args) 및 ConfigureWebHostDefaults() 함수를 호출하여 웹 서비스에 필요한 기본적인 설정사항등을 별도 작업없이 추가해주는데 이때 MS에서 기본제공하는 Log 제공자(Provider)도 추가된다. Serilog 와 같이 서드파티 제공자를 사용하고 싶다면 CreateHostBuilder를 아래와 같이 수정하여 MS 기본 제공 Log 공급자를 제거해야 한다. public static IHostBuilder CreateHostBuilder(string[] args) => Host.Cr..
-
[.NET] Dependency Injection(DI)를 쓰는 이유.NET/개념 및 유용한 팁 2021. 8. 7. 12:46
ASP.NET Core는 기본적으로 DI가 적용된 구조로 생성된다. 그런데 왜 DI 가 적용되어있을까? 인터넷에서 보면 다음과 같은 이유로 DI가 좋다고 되어있다. 코드의 재사용성을 높인다. 결합도를 낮춘다. 여러 블로그글을 보면 위 내용들이 많다. 그런데 왜 재사용성이 높아지고, 결합도가 낮아지는 건지 와닿진 않는다. 그리고 굳이 DI를 써야하나라는 의구심이 들기도 한다. 솔직히 필자도 DI 가 좋은 이유에 대해 제대로 설명해보라고하면 못할 듯 싶다. 그래서 아래 간단한 실습을 통해 DI가 어떻게 동작하며, 왜 좋은지 포스트로 남겨보고자 한다. 1. 프로젝트 생성 "WhyUseDI" 라는 이름의 솔루션을 생성하고, "WhyUseDI.API" webapi 와 "Services" classlib 프로젝트를..
-
[ASP.NET Core] AddController(), AddMvc(), AddControllersWithViews(), AddRazorPages() 차이점.NET/ASP.NET Core 2021. 6. 26. 11:33
ASP.NET Core에서 MVC 템플릿으로 프로젝트를 생성하면 Startup 클래스의 ConfigureServices 메소드에서AddControllersWithViews()를 확인할 수 있다. public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); } 함수 이름으로 유추해봐도 알 수 있듯이, MVC 모델의 Controller와 View를 ASP.NET Core에서 사용하겠다는 뜻을 의미한다. 그런데 AddControllersWithViews 가 아닌, AddMVC를 사용해도 문제없이 동작하는 것을 확인할 수 있다. 이 메소드들은 공통적으로 MvcServiceCollectionExtens..