【问题标题】:SSIS Cannot consume web serviceSSIS 无法使用 Web 服务
【发布时间】:2014-06-13 23:58:53
【问题描述】:

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

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

Error: 0xC002F304 at Web Service Task, Web Service Task: An error occurred with the following error message: "Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebserviceTaskException: The Web Service throw an error during method execution. 错误是: 底层连接已关闭: 无法为 SSL/TLS 安全通道建立信任关系.. 在 Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebMethodInvokerProxy.InvokeMethod(DTSWebMethodInfo 方法信息,字符串服务名称,对象连接) 在 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 处的 0x0,WEB 异常 CAUGHT::服务器违反了协议。 Section=ResponseStatusLine 错误:脚本任务 1 处的 0x6:脚本返回失败结果。

这个问题我试过了

  • 将 ProtocolVersion 设置为 1.0,然后尝试 1.1

  • 将 KeepAlive 设置为 false

  • 设置 ServicePoint.Expect100Continue = false;

  • 试图以编程方式将useUnsafeHeaderParsing设置为true,但即使编辑器没有提示任何错误,脚本也无法编译(可能是反射引起的,我不知道)

  • 不知道如何访问我的 SSIS 包中的配置以将 useUnsafeHeaderParsing 设置为 true

这些都不起作用。我使用哪个任务并不重要,我只需要一个工作即可。任何人有任何想法/建议或可以指出我可以用来研究这些问题的其他任何东西吗? (我已经用谷歌搜索了两天了:()。

下面是我脚本中的代码的 sn-p,以防其他人看到我忽略的问题。感谢您抽出宝贵时间阅读我的问题!

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

【问题讨论】:

    标签: c# web-services ssis cisco


    【解决方案1】:

    启用 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。唯一的问题是 .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/

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2011-01-08
      相关资源
      最近更新 更多