C#
-
[EFCore] Microsoft.Data.SqlClient.SqlException 오류 뜰 때.NET/개념 및 유용한 팁 2022. 1. 30. 11:48
개발 중인 프로젝트에서 아래와 같은 오류가 발생했다. Microsoft.Data.SqlClient.SqlException: 'A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 신뢰되지 않은 기관에서 인증서 체인을 발급했습니다.)’ 원인은 따로 설치했던 Microsoft.EntityFrameworkCore.SqlServer 패키지에서 참조하는 Microsoft.Data.SqlClient 에 호환되는 버전이 맞지 않으면 발생했던 문제이다. 따로 설치된 Microsoft.Data.SqlClient ..
-
[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..
-
[xUnit] 테스트 프로젝트를 로깅(Logging)하는 방법.NET/개념 및 유용한 팁 2021. 10. 31. 13:21
xUnit과 같은 테스트 프로젝트는 각 테스트 함수별 진행에 따른 로그가 별도 표시되어야 할 필요성이 있다. 아래 프로젝트는 webapi 템플릿을 생성할때 나오는 `WeatherForcast` 프로젝트의 Controller 테스트 코드이다. using Microsoft.Extensions.Logging; using System.Linq; using Xunit; using Xunit.Abstractions; namespace WebApiTestCase.Controllers.Tests { public class WeatherForecastControllerTests { private ITestOutputHelper _logger; public WeatherForecastControllerTests(ITest..
-
[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..
-
[.NET Tools] 웹 기반 dotnet playground 서비스 sharplab.io.NET/유용한 라이브러리 2021. 6. 5. 19:05
https://sharplab.io/ SharpLab Code [connection lost, reconnecting…] sharplab.io 웹에서 .NET 기반 소스코드를 작성하고 결과를 바로바로 확인할 수 있는 웹 서비스이다. 코드를 작성하여 단순 결과를 보는 것 뿐만 아니라 Debug, Release시 최적화되는 소스코드 및 중간언어(IL)로 변환되었을때 어떻게 되는지 확인할 수 있다. 기존에 Visual Studio 에선 해당 소스코드가 boxing과 같이 성능저하 문제가 발생할만한 요소가 있는지 확인하기위해 visual studio 와 함께 설치되는 Ildasm.exe 도구를 써서 확인해야하는 수고로움이 있었다. SharpLab에선 바로바로 확인이 가능하다. 코드를 작성하면 URL에 파라메터가..
-
[.NET] IEnumable에 대한 성능팁.NET/개념 및 유용한 팁 2021. 6. 5. 16:31
매일 수신받는 medium 에서 IEnumable에 대한 유용한 글을 수신받았다. 번역기가 있어 어느정도 이해할 순 있지만 내용이 좀 길어 짧게 정리할 겸 포스트를 쓴다. 1. Count() != 0 보단 Any()를 써라 종종 배열(IEnumable)에 요소가 있는지 여부를 사용할 때, Count() != 0 조건을 사용하는 경우가 많다. 그러나 Count()는 각 요소의 개수를 구하기 위해 아래와 같은 구현으로 동작한다. public static int Count(this IEnumerable enumerable) { var count = 0; using(var enumerator = enumerable.GetEnumerator()) { while (enumerator.MoveNext()) count..
-
[C# 8.0] 당신의 Substring() 범위 연산자로 대체되었다..NET/개념 및 유용한 팁 2021. 4. 17. 16:38
인터넷에서 방황하다 C# 배열에 대한 배열에 dot(.)을 두개 써서 배열의 범위 일부를 가져올 수 있는 범위 연산자를 확인하게 되었다. C# 8.0 부터 나온 건데 이제야 알게 되었다. 범위 연산자를 알기 전까지, 문자열의 지정된 index 에서 분해할 단어의 길이만큼 잘라 표현해야할 때 Substring 함수를 사용했었다. Console.WriteLine("Substring 기존 방식".Substring(0, 9)); 그러나 C# 8.0 부터는 아래와 같이 사용할 수도 있다. Console.WriteLine("Substring_C# 8부터 사용가능한 방식"[0..9]); 문자열 때문에 소스길이가 더 길어보이는데 실질적으론 .Substring(0,9) -> [0..9]가 된것이므로 코드가 줄어든게 맞다..
-
[EntityFramework Core] dbContext 여러 번 사용시 유의사항 (feat. Dbset 프로퍼티 데이터 불일치 현상).NET/개념 및 유용한 팁 2021. 3. 6. 11:52
회사에서 솔루션 개발중 겪은 뻘짓이 있어 기록한다. 현재 메일발송 서비스를 개발중에 있는데, 기존 DB와 신규 서비스의 DB 구조가 달라 호환을 위해 완료된 데이터를 기존 DB에도 입력하는 기능을 구현했다. 신규 DB에서 완료된 조건에 일치하는 데이터만 Where() 함수를 통해 가져와서 기존 DB에 Insert하는 작업인데, 조건에 부합되는 항목들을 Insert 하려니 "발송대기" 상태인 초기값으로 나온다. Worker Service Task 를 여러 개 사용하는 구조인데, Task는 각각 역할이 정해져있으며, ConcurrentQueue를 통해 데이터를 단방향으로 처리하기 때문에 스레드에 의한 데이터 불일치 현상이 일어나는 구조는 아니다. 설명이 어려우니 재현을 위해 소스코드를 준비해보겠다. .NET..