我使用SSIS连接托管在管理我们电话的思科机器上的思科网络服务。我已经在SoapUI中对该服务进行了测试,并发现了所有工作。我可以获取/使用WSDL,可以使用身份验证凭据连接到服务,获得预期的回复。
我首先尝试使用Web服务任务。我设置了我的Http Connection Manager,选择它来使用凭据,然后运行测试。测试成功完成。我下载了wsdl并将其保存在本地。在Web服务任务中,我指向wsdl文件,并在输入窗格中检测到服务和方法。但是当我执行任务时,我得到以下异常:
错误:Web服务任务中的0xC002F304,Web服务任务:出现以下错误消息时出错:" Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebserviceTaskException:Web Service在方法执行期间引发错误。错误是:基础连接已关闭:无法为SSL / TLS安全通道建立信任关系。 在Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebMethodInvokerProxy.InvokeMethod(DTSWebMethodInfo methodInfo,String serviceName,Object connection) 在Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebServiceTaskUtil.Invoke(DTSWebMethodInfo methodInfo,String serviceName,Object connection,VariableDispenser taskVariableDispenser) 在Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebServiceTask.executeThread()"。
再次,我的Http连接测试通过了,我重新输入了我的凭据,使我能够多次成功地使用SoapUI进行测试。
在无法使用Web服务任务解决问题后,我尝试使用脚本任务。我设置了一个HttpWebRequest并设置所有标题属性,就像在SoapUI中测试时一样。另外,我将Authorization:Basic值设置为正确的值。然后,我构建了传递给StreamWriter的数据字符串,与SoapUI中的SOAP Envelope完全相同。 StreamWriter写入然后关闭,但是当我调用GetResponse时,我得到了一个很好的例外:
警告:脚本任务1处的0x0,WEB EXCEPTION CAUGHT ::服务器提交了协议违规。第= ResponseStatusLine 错误:脚本处的0x6任务1:脚本返回了失败结果。
对于这个问题,我试过了
将ProtocolVersion设置为1.0,然后尝试1.1
将KeepAlive设置为false
设置ServicePoint.Expect100Continue = false;
尝试以编程方式将useUnsafeHeaderParsing设置为true,但即使编辑器没有指出任何错误(可能是由反射导致,我不知道),脚本也无法编译
不知道如何访问我的SSIS包中的配置,以便将useUnsafeHeaderParsing设置为true
这些都没有奏效。我使用哪个任务并不重要,我只需要一个工作。任何人都有任何想法/建议,或者可以指出我可以用来研究这些问题的任何其他内容? (我现在谷歌搜索了两天:()。
以下是我脚本中的代码片段,以防其他任何人看到我忽略的问题。感谢您抽出宝贵时间阅读我的问题!
StreamReader responseReader = null;
StreamWriter requestWriter = null;
string data = getPayload();
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://***********:8443/realtimeservice2/services/RISService");
httpRequest.ProtocolVersion = System.Net.HttpVersion.Version11;
httpRequest.Method = "POST";
httpRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
httpRequest.ContentType = "text/xml;charset=UTF-8";
httpRequest.Accept = "Accept: text/*";
httpRequest.Headers.Add("SOAPAction", "executeCCMSQLStatement");
httpRequest.Headers.Add("Authorization", "Basic ********");
httpRequest.ContentLength = data.Length;
httpRequest.Host = "*********:8443";
httpRequest.KeepAlive = false;
httpRequest.UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)";
requestWriter = new StreamWriter(httpRequest.GetRequestStream(), System.Text.Encoding.ASCII);
requestWriter.Write(data);
requestWriter.Close();
WebResponse webResponse = httpRequest.GetResponse();//EXCEPTION THROWN
更新
因此,我们尝试将服务主机的证书安装到进行调用的计算机的受信任根存储中。连接管理器现在可以成功测试https,但是当我运行该包时,我仍然得到相同的“无法建立SSL / TLS的信任关系”问题。我的桌面仍然可以成功连接到服务,拨打电话,并获得预期的结果。但由于某种原因,我不能让数据库服务器和服务主机一起玩得很好。
答案 0 :(得分:0)
启用TLS的方式取决于所使用的.NET版本:
NET 4.5。支持TLS 1.2,但它不是默认协议。您需要选择使用它。以下代码将TLS 1.2设置为默认值,请确保在连接到安全资源之前执行它:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
NET 4.0。不支持TLS 1.2,但是如果系统上安装了.NET 4.5(或更高版本),那么即使您的应用程序框架不支持TLS 1.2,您仍然可以选择使用TLS 1.2。唯一的问题是.NET 4.0中的SecurityProtocolType没有TLS1.2的条目,因此我们必须使用该枚举值的数字表示形式:
ServicePointManager.SecurityProtocol =(SecurityProtocolType)3072;
NET 3.5或更低版本。不支持TLS 1.2(*),并且没有解决方法。将您的应用程序升级到该框架的最新版本。
更多信息:https://blogs.perficient.com/2016/04/28/tsl-1-2-and-net-support/