嗯,我已经弄清楚了。我花了比我想谈论的时间更长的时间,但我想分享我的解决方案,因为看到这个标准是我非常讨厌的。 “哦,我修好了!谢谢!”帖子让每个人都对实际发生的事情抱有疑问。
So.
根本问题是,默认情况下 Visual Studio 2008 使用 TLS 进行 SSL 握手,而我尝试连接的基于 Oracle/Java 的 Web 服务使用的是 SSL3。
当您在 Visual Studio 2008 中使用“添加服务引用...”时,您已经无法指定安全协议 http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/37c376a3-f50c-4b57-a1df-83dc43fcddbf对于服务点管理器应该是 SSL3。
Unless.
您获取一个静态 WSDL 文档并使用wsdl.exe生成代理类 http://gsraj.tripod.com/dotnet/webservices/webservice_csharp_client.html.
wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl
然后您可以使用C 夏普编译器 http://msdn.microsoft.com/en-us/library/1700bbwd(VS.80).aspx将该代理类转换为库 (.dll) 并将其添加到您的 .Net 项目“参考”中。
csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs
此时,您还需要确保您的“参考”中也包含了 System.Web.Services。
现在您应该能够调用您的 Web 服务,而代码不会出现问题。为了做到这一点work在实例化服务之前,您需要添加一行神奇的代码。
// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
好吧,我对自己印象非常深刻,因为在我的开发盒上进行的测试非常棒。然后我部署到另一个客户端盒子,由于权限/权限问题,它不会再次连接。对我来说,这闻起来像证书(不管它们闻起来像什么)。为了解决这个问题,我使用 certmgr.exe http://msdn.microsoft.com/en-us/library/aa388161(VS.85).aspx将站点的证书注册到本地计算机上的受信任根。
certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root
这允许我将证书分发到我们的客户端站点并自动为用户安装。我仍然不确定不同版本的 Windows 在像这样的自动证书注册方面有多“安全友好”,但到目前为止效果很好。
希望这个答案对一些人有帮助。也感谢 Blowdart 在这方面提供的所有帮助并提供了一些见解。