에서Net 프레임워크 Bug의 수정 코드가 에 성공적으로 통합되었습니다.NET CoreFX 메인
레코드 복구https://github.com/dotnet/corefx/commit/94b1f1eae84fd4823cfa2bbdde6fc87c46b57908
버그 복구에 실제 적용되는 코드는 20글자에 불과하지만 의미가 크다. 이 버그는 아무 일도 일어나지 않았고 프레임에 칼을 꽂지 않는 것을 만나면 매우 까다롭고 괴로움을 겪어도 약간의 두뇌를 파악하기 어렵다.
관련 상세한 상황은 나의 또 다른 블로그인 을 보십시오. Net 프레임워크 버그 발견과 제출 과정:. Net Framework와. Net Core가 모두 영향을 받았습니다.
문제 설명
우리는
SmtpClient
의 SendAsync
, SendMailAsync
의 비동기적인 방법으로 메일을 보내고 DeliveryFormat
=
SmtpDeliveryFormat.SevenBit
형식으로 중국어 내용을 인코딩해야 한다. 원래 메일 내용에 중국어가 있는 Subject
, Attachments file name
이 모두 Base64 인코딩을 할 것으로 예상했다.그러나 실제 결과는 메일 서버가
SMTPUTF8
확장을 지원한다면 SevenBit
메일을 비동기적으로 보내는 것은Base64 인코딩을 하지 않고 동기화 방법에 문제가 없다는 것이다.문제의 근원
그 이유는
SmtpClient.SendMailCallback
방법에서 message.BeginSend
allowUnicode
매개 변수가 통일된 ServerSupportsEai
이 아닌 IsUnicodeSupported()
을 직접 사용했기 때문이다. private void SendMailCallback(IAsyncResult result)
{
......
_message.BeginSend(_writer, DeliveryMethod != SmtpDeliveryMethod.Network,
ServerSupportsEai, new AsyncCallback(SendMessageCallback), result.AsyncState);
......
}
ServerSupportsEai
을 IsUnicodeSupported()
으로 바꾸어 문제를 해결하다.이 20글자만 변경~그리고 현재 버그가 있는 것을 동봉합니다.Net 프레임워크 수정 방법
예를 들면 사용한.NET Framework 4.7.2, 이 Bug은 천연 원본으로 만들어졌으며, 우리는 우리의 코드로 복구할 수 있습니다.
처음에 테스트를 시작했을 때 이 방법이 무효였는데 훅이 틀린 곳인 줄 몰랐어요. 가장 깊은 차원에서 호출된 곳으로 바꿔서 한 번에 정확하게 잡았어요.
DotNetDetour 라이브러리 쌍을 사용합니다.Net 프레임워크에서 Hook을 진행하여
SmtpClient.ServerSupportsEai
을 찾아낸 결과 최종적으로 SmtpConnection.ServerSupportsEai
에서 얻은 것이다. 아마도 C#를 컴파일한 후에 전체 호출 과정을 최적화시켰고 값을 받는 곳에서 직접 호출한 SmtpConnection
의 방법으로 바뀌었기 때문에 Hook의 앞의 방법은 모두 실행되지 않을 것이다. Hook SmtpConnection.ServerSupportsEai
이 정확하게 잡았다.훅 코드를 첨부하려면 다음과 같이 하십시오.
public class Hook : IMethodMonitor {
public bool ServerSupportsEai {
[Monitor("System.Net.Mail", "SmtpConnection")]
get {
Console.WriteLine("Hook");
return !true?org():false;// Hook? AsyncLocal CallContext ?
}
}
[Original]
public bool org() {
return false;
}
}
또 다른 괴롭힘 Bug을 끌어냈다. 비동기적인 환경에서
ServerSupportsEai
의 호출 창고에서 상하문이 어떻게 잃어버릴까?혹시 ThreadPool.UnsafeXXX
과 같은 효과가 어디에 쓰였나요?우리는 CallContext
(AsyncLocal
)을 통해 훅 코드에 파라미터를 전달할 수 없어서 죽을 수밖에 없다. 호출자가 반환값을 수정하든 말든 수정된 결과만 얻을 수 있고 어색하지 않다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.