我正在使用SSIS连接到托管在管理我们电话的Cisco机器上的Cisco Web服务。我已经在SoapUI中测试了该服务,并发现一切正常。我可以获取/使用WSDL,可以使用身份验证凭据连接到服务,获得预期的答复。

我首先尝试使用Web服务任务。我设置了Http连接管理器,选择了它以使用凭据,然后运行了测试。测试成功完成。我下载了wsdl并将其保存在本地。在Web服务任务中,我指向wsdl文件,并在输入窗格中检测到服务和方法。但是当我执行任务时,出现以下异常:

Web Service任务,Web Service任务上的错误:0xC002F304:发生错误,并出现以下错误消息:“ Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebserviceTaskException:Web Service在方法执行期间引发了错误。错误是:基础连接已关闭:无法建立SSL / TLS安全通道的信任关系。
   在Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebMethodInvokerProxy.InvokeMethod(DTSWebMethodInfo methodInfo,字符串serviceName,对象连接)
   在Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebServiceTaskUtil.Invoke(DTSWebMethodInfo methodInfo,字符串serviceName,对象连接,VariableDispenser taskVariableDispenser)
   在Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebServiceTask.executeThread()”处。

再次,我的Http连接测试通过了,我重新输入了凭据,使我现在可以成功地多次使用SoapUI进行测试。

无法解决Web服务任务的问题后,我尝试使用脚本任务。我设置了一个HttpWebRequest并以与在SoapUI中进行测试时相同的方式设置所有标头属性。另外,我将“授权:基本”值设置为正确的值。然后,我以与SoapUI中的SOAP信封完全相同的方式构建了传递到StreamWriter的数据字符串。 StreamWriter写入然后关闭,但是当我调用GetResponse时,我得到了一个奇妙的例外:

警告:脚本任务1,Web异常警告:0x0:服务器提交了协议冲突。 Section = ResponseStatusLine
错误:脚本任务1:0x6:脚本返回失败结果。

对于这个问题,我已经尝试过


将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建立信任关系”问题。我的桌面仍然可以成功连接到该服务,进行呼叫并获得预期的结果。但是由于某种原因,我无法让数据库服务器和服务主机一起玩。

最佳答案

启用TLS的方式取决于所使用的.NET版本:


NET 4.6及更高版本。您无需做任何其他工作即可支持TLS 1.2,默认情况下支持该功能。
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/

关于c# - SSIS无法使用Web服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24215289/

10-12 12:42
查看更多