從.Net框架Bug的提交到修復程式碼成功合併到.NET CoreFX主
問題描述
我們用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個字元的改動~
另外附對現有帶Bug的.Net框架修復方法
比如使用的.NET Framework 4.7.2,純天然原生自帶此Bug,我們可以用我們的程式碼修復它。
最開始測試時以為此方法無效,沒想到是Hook錯了地方,換到最深層次呼叫地方,一抓一個準。
使用庫對.Net框架內方法進行Hook,找出SmtpClient.ServerSupportsEai
最結果最終是從SmtpConnection.ServerSupportsEai
得來的,也許是C#編譯後把整個呼叫過程都最佳化掉了,變成了取值的地方直接呼叫的SmtpConnection
中的方法,導致Hook前面的方法都是不會被執行,Hook SmtpConnection.ServerSupportsEai
一抓一個準。
附上Hook程式碼:
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
)給Hook程式碼傳引數,只能寫死,不管呼叫方要不要修改返回值,都只能得到修改後的結果,尷尬不尷尬。
作者:高堅果兄弟
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3137/viewspace-2820191/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 把成熟的程式碼從.NET移植到MonoMono
- MySQL主從修復MySql
- Android熱修復原理(一)熱修復框架對比和程式碼修復Android框架
- Alibaba-AndFix Bug熱修復框架的使用框架
- Alibaba-AndFix Bug熱修復框架原理及原始碼解析框架原始碼
- 對 ActiveMQ .NET 1.1.0 元件接受中文資訊亂碼的修復MQ元件
- .NET生成小程式碼,併合自定義背景圖生成推廣小程式二維碼
- 部落格園主題美化中BUG修復方法
- 程式設計師如何修復婚姻的Bug?程式設計師
- 程式設計師如何修復婚姻的 bug?程式設計師
- Oracle bug的手工修復Oracle
- [BUG反饋]OneThink安裝到阿里雲主機提示404阿里
- 【MySQL】主從GTID複製修復MySql
- PHP 圖片的合併,微信小程式碼合併,文字合併PHP微信小程式
- 最牛程式設計師修復BUG程式設計師
- 修復一個kubernetes叢集
- 熱修復框架原始碼剖析(上)框架原始碼
- win10執行ie錯誤程式碼inet_e_resource_not_found的修復方法Win10
- [Net 6 AspNetCore Bug] 解決返回IAsyncEnumerable<T>型別時丟擲的OperationCanceledException會被AspNetCore 框架吞掉的BugNetCore型別Exception框架
- .NET 中的併發程式設計程式設計
- 大腦如同程式設計,bug如何修復?程式設計
- 程式設計師,請儘早修復你的Bug程式設計師
- 程式設計師 請儘早修復你的Bug程式設計師
- 不安裝.net framework框架執行.Net 程式的方法<收藏>Framework框架
- MySQL主從不一致的修復過程MySql
- CNN網路結構的發展:從LeNet到EfficientNetCNN
- 讓 .Net程式脫離 .Net Framework框架執行Framework框架
- 微軟修復Bug的補丁產生了新的Bug微軟
- Reflector反編譯.NET檔案後修復編譯
- sco 遠端登入很慢 telnet修復
- C#/VB.NET 合併PDF頁面C#
- 從Membership 到 .NET4.5 之 ASP.NET IdentityASP.NETIDE
- 記一次Git分支合併引起的問題和修復Git
- 我的IT人生:修復別人的BUG
- Android中熱修復框架Robust原理解析+並將框架程式碼從"閉源"變成"開源"(下篇)Android框架
- 當老闆找程式設計師修復BUG時程式設計師
- redis cluster 故障後,主從位於不同節點的修復。Redis
- 如何修復 Mozilla Firefox 中出現的 “Network Protocol Error”FirefoxProtocolError