에서Net 프레임워크 Bug의 수정 코드가 에 성공적으로 통합되었습니다.NET CoreFX 메인

2931 단어
발견하다.NET Framework에서 SmtpClient의 Bug을 제출하고 해결 방안을 제시한 다음에 마이크로소프트 개발자 커뮤니티에 Bug를 제출하는 것을 시작합니다. 총 한 달여가 걸렸고 Bug에서 복원된 코드가 최종적으로 채택되었고 현재는 통합되었습니다.NET Core Libraries(CoreFX) 메인 라인에 있습니다.

레코드 복구https://github.com/dotnet/corefx/commit/94b1f1eae84fd4823cfa2bbdde6fc87c46b57908


버그 복구에 실제 적용되는 코드는 20글자에 불과하지만 의미가 크다. 이 버그는 아무 일도 일어나지 않았고 프레임에 칼을 꽂지 않는 것을 만나면 매우 까다롭고 괴로움을 겪어도 약간의 두뇌를 파악하기 어렵다.
관련 상세한 상황은 나의 또 다른 블로그인 을 보십시오. Net 프레임워크 버그 발견과 제출 과정:. Net Framework와. Net Core가 모두 영향을 받았습니다.

문제 설명


우리는 SmtpClientSendAsync, 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); 
    ......
 } 
ServerSupportsEaiIsUnicodeSupported()으로 바꾸어 문제를 해결하다.이 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)을 통해 훅 코드에 파라미터를 전달할 수 없어서 죽을 수밖에 없다. 호출자가 반환값을 수정하든 말든 수정된 결과만 얻을 수 있고 어색하지 않다.

좋은 웹페이지 즐겨찾기