2016-04-28 16 views
0

により、いくつかの証明書の問題のために、私はServerCertificateValidationCallback反転

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true; 

これが行われた呼び出しの後に、それを逆にするより良い方法であると書かなければならなかった、またはこれは不要でしょうか?

var temp = ServicePointManager.ServerCertificateValidationCallback; 
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true; 

var r = func(obj); 

ServicePointManager.ServerCertificateValidationCallback = temp; 

答えて

1

全体の動作は、元の値が例外が飛んでいる場合でも、復元されることを保証するために、try ... finallyに包まれなければなりません。 +=は、検証以外のもの(例えば、ログ)に対してコールバックを使用していない人がいない限り、=に置き換えることができます。

当然のことながら、このスキームは、同時の状況では、その面で平坦になります。問題はHeisenbugsの代わりにパフォーマンスが悪いというだけの理由で重大なセクションに入れられるべきです。

+0

ここでコールバックが* event *の場合、デフォルトで生成されるコードイベント加算器は適切なローロックアルゴリズムを実行して、失われた追加がないことを保証する。もちろん、ここのコールバックが単にデリゲートであれば - そのように見えます - はい、コード自体を書く責任があります。 –

+0

@エリック:デリゲートとして文書化されています。しかし、事象があっても、演算子 '+ ='の逆は ' - ='であり、古い*やおそらく失効した*状態を復元しません。これは、オペレータ自身が(完全に「temp」を落とす)安全性を安全にするでしょう。もちろん、 ' - ='は、 '+ ='がそれを識別するためにラムダを '実現'(キャッチ)する必要があり、 'var'がC#でラムダでは動作しないという事実から来ています。 ... – DarthGizka