【发布时间】:2012-01-23 23:13:07
【问题描述】:
在我的 WPF 应用程序中,我想通过 HTTPS 与 Web 服务建立连接,忽略可能的证书错误,根据我的研究,这似乎是相当常见的事情。
我发现了这个漂亮的 sn-p:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
我在 return 语句上设置了一个断点,它从未被调用过(也用单独的方法尝试过)。
我还尝试将以下属性设置为 false:
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.Expect100Continue = false; //tried true too
ServicePointManager.CheckCertificateRevocationList = false;
我还尝试使用始终返回 true 的 CheckValidationResult 创建自己的 ICertificatePolicy,并将其归因于 ServicePointManager.CertificatePolicy。这也没有奏效。
在所有这些尝试中,我得到以下结果:
底层连接已关闭:发生意外错误 一个接收
我用三行代码创建了一个单独的 Windows 窗体应用程序:
WebReference.MySebService myWebService = new WebReference.MySebService();
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
bool result = myWebService.TestConnection();
//TestConnection is a method in my WebService that simply returns true.
它成功了。
我还能尝试什么?
信息:
- WPF 应用程序
- .NET 3.5
- Web 服务通过单独的类使用
- 它与常规 HTTP 完美配合
- 不使用代理
- 服务器和本地主机上的 WS 均失败
- 在我的测试应用程序上运行的相同三行代码在我的 WPF 应用程序中不起作用
- WebService 的两个实例完全相同(所有属性,包括 URL)
- 尝试删除并重新添加网络引用,就像在我的测试应用中一样。
【问题讨论】:
-
您已在 WinForms 应用程序中显示了所有代码 - 您尚未显示 WPF 应用程序的等效代码。
-
同样的三行,复制粘贴到我的 WPF 应用程序中也不起作用。我已经分析了我的 Web 服务的两个实例,它们是相同的。所有的标志,以及 URL 属性。
-
您是否尝试过在“解密 HTTPS”模式下使用 Fiddler 作为代理来查看发生了什么?可能还不清楚......不过,我会对这两个 UI 对 HTTPS 通信产生任何影响感到非常惊讶。控制台应用呢?
-
我现在就试试。我的想法是,由于这条线不会影响我的任何对象,它会将委托应用于我的 .NET 运行时的某个地下部分,并且可能项目的类型会影响运行时,使用不同的线程或类似的东西.
-
我的控制台应用尝试:i.stack.imgur.com/kWAAR.jpg
标签: c# web-services ssl https certificate