如何在RemoteCertificateValidationCallback委托中传递MyObject对象
问题描述
我有一个MethodA方法,会在其中创建一个对象:
private void MethodA() { MyObject myObject = new MyObject(); try { ServicePointManager.ServerCertificateValidationCallback += MethodB; // some logic } catch(Exception ex) { // some handling } finally { // some logic ServicePointManager.ServerCertificateValidationCallback -= MethodB; } }
在我的MethodB方法中,需要获取这个MyObject实例:
private bool MethodB(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { // 需要在这里访问MyObject }
请问有没有正确的实现方式?
可行解决方案
方法一:利用闭包捕获变量
直接用lambda表达式替代独立的MethodB,借助C#闭包特性直接访问myObject,同时可以把验证逻辑抽成独立方法保持代码整洁:
private void MethodA() { MyObject myObject = new MyObject(); // 定义捕获myObject的验证回调 RemoteCertificateValidationCallback validationCallback = (sender, cert, chain, errors) => { // 直接访问myObject Console.WriteLine(myObject.SomeProperty); // 调用抽离的验证逻辑方法 return ValidateCertificate(myObject, sender, cert, chain, errors); }; try { ServicePointManager.ServerCertificateValidationCallback += validationCallback; // some logic } catch(Exception ex) { // some handling } finally { ServicePointManager.ServerCertificateValidationCallback -= validationCallback; } } // 抽离原MethodB的逻辑,接收MyObject参数 private bool ValidateCertificate(MyObject myObject, object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { // 在这里使用myObject处理验证逻辑 return true; // 根据实际需求返回验证结果 }
这种方式简单直接,无需额外状态管理,适合大多数场景。
方法二:通过请求对象的属性传递(适用于HttpWebRequest场景)
如果你的业务逻辑基于HttpWebRequest,回调的sender参数通常就是该请求实例,可以把myObject存入请求的自定义属性中:
private void MethodA() { MyObject myObject = new MyObject(); // 创建请求实例 HttpWebRequest request = WebRequest.Create("https://example.com") as HttpWebRequest; // 将myObject存入请求的自定义属性集合 request.Properties["MyObjectKey"] = myObject; try { ServicePointManager.ServerCertificateValidationCallback += MethodB; // 执行请求发送等逻辑 using (var response = request.GetResponse() as HttpWebResponse) { // 处理响应 } } catch(Exception ex) { // some handling } finally { ServicePointManager.ServerCertificateValidationCallback -= MethodB; } } private bool MethodB(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { if (sender is HttpWebRequest request) { // 从请求属性中取出MyObject if (request.Properties.TryGetValue("MyObjectKey", out var obj) && obj is MyObject myObject) { // 使用myObject处理逻辑 Console.WriteLine(myObject.SomeProperty); } } // 执行验证逻辑 return true; }
注意:该方法依赖sender的具体类型,仅当回调触发时sender是你可控的请求对象时生效。
方法三:自定义封装类管理状态
创建专门的验证器类,封装MyObject实例和验证逻辑,避免闭包可能带来的生命周期混淆:
// 自定义验证器类,保存需要的MyObject实例 private class CertificateValidator { private readonly MyObject _myObject; public CertificateValidator(MyObject myObject) { _myObject = myObject; } // 验证方法,包含原MethodB的逻辑 public bool Validate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { // 直接使用_myObject Console.WriteLine(_myObject.SomeProperty); // 执行验证逻辑 return true; } } private void MethodA() { MyObject myObject = new MyObject(); var validator = new CertificateValidator(myObject); try { ServicePointManager.ServerCertificateValidationCallback += validator.Validate; // some logic } catch(Exception ex) { // some handling } finally { ServicePointManager.ServerCertificateValidationCallback -= validator.Validate; } }
这种方式状态管理更清晰,适合复杂业务场景下的逻辑拆分。
内容的提问来源于stack exchange,提问作者Sara Mannings
相关产品推荐
相关产品推荐

