에서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에 따라 라이센스가 부여됩니다.