2016-04-28 83 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以确保在异常飞来飞去,原来的价值变得更加恢复。 +=可以替换为=,除非有人使用回调来验证其他内容(例如日志记录)。

当然,这个计划在同时出现的情况下会持平。至少应该把事情放在一个关键的部分或互斥,以便问题表现仅仅作为表现不佳,而不是海森堡...

+0

我注意到,如果这里的回调是一个*事件*然后代码默认生成事件添加器将执行适当的低锁定算法以确保没有丢失的添加。当然,如果这里的回调只是一个委托 - 看起来像 - 那么是的,你自己负责编写代码。 –

+0

@Eric:它被记录为代表。然而,即使是事件,运算符'+ ='的反转也是' - =',而不是恢复一些旧的*和可能过时的*状态。这会使该方案与运营商本身一样安全(完全降低“临时”)。当然,' - ='是有问题的,因为它需要'物化'(捕获)'+ ='的lambda以赋予其身份,另一个复杂因素来自'var'不能与C#中的lambdas一起使用... – DarthGizka