微信退款時遇到:基礎連接已經關閉 連接被意外關閉。
服務器環境:WIN SERVER 2008 R2. WINDOWS服務承載的WCF服務,基於.NET FRAMEWORK 3.5.
第一筆交易的退款是正常的,第二筆交易的退款就提示這個錯誤。重新導入證書后正常。再做一筆退款時還是報錯。反復如此。
同一環境另一證書一切正常。。。。。。。。
問題代碼:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl); req.KeepAlive = false; X509Certificate cer = new X509Certificate(certFullName, password);
在網上搜索了下,有人這樣寫:
X509Certificate2 certificate = new X509Certificate2(PATH_TO_CERTIFICATE, PASSWORD, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
也有人這樣寫:
X509Certificate2 cer = new X509Certificate2(certFullName, password,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
估計是優先從X509KeyStorageFlags.MachineKeySet 這個地方去找證書。
但是沒在意他們都用的是:X509Certificate2。而我用的仍是X509Certificate。
“X509Certificate cer = new X509Certificate(certFullName, password);”這段代碼是微信官方DEMO里的,如下圖:
我以為代碼里加下X509KeyStorageFlags即可,即:
X509Certificate cer = new X509Certificate(certFullName, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
仍然用的是“X509Certificate”,測試后仍不行。
無意間注意到兩者不是同一個類,就去找X509Certificate和X509Certificate2的不同。
在微軟文檔中:https://msdn.microsoft.com/zh-cn/library/system.security.cryptography.x509certificates.x509certificate(v=vs.90).aspx
有提到:
"ASN.1 DER 是此類支持的唯一證書格式。
在大多數情況下,您應該使用 X509Certificate2 類。"
阿西八,我用的是:X509Certificate.
最后改成:
X509Certificate2 cer = new X509Certificate2(certFullName, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
更新下程序,測試了兩個證書的四次退款均正常(每證書兩次)。