【问题标题】:msxml3.dll in context sp_OAMethod 'send'上下文 sp_OAMethod 'send' 中的 msxml3.dll
【发布时间】:2014-11-05 19:48:18
【问题描述】:

Win2003 + SQL Server 2005 的工作代码在 Win2012 + SQL Server 2012 sp1 下不起作用。

我找到的唯一~realsolution是:

我将 C:\Windows\System32\msxml3.dll 从 Server 2008 复制到同一个 2012 年服务器上的目录。2012 年服务器上的问题已解决,使用 POST 发送 并且 GET 工作正常。

但是由于我无法修改服务器并且 msxml3.dll 和 msxml6.dll 都被锁定 - 我需要了解问题所在并以其他方式应用。

获取soap web服务的代码很简单:

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);
Declare @ErrCode    Int;

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'post','http://example.com/Authentication.asmx','false'
Exec sp_OAMethod @Object ,'setRequestHeader'    ,NULL ,'Content-Type'   ,'text/xml; charset=utf-8'
Exec sp_OAMethod @Object ,'setRequestHeader'    ,NULL ,'SOAPAction' ,'"http://www.example.com/Login"'
Exec @ErrCode=sp_OAMethod @Object, 'send',null,'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <Login xmlns="http://www.example.com/">
      <databaseName>db1</databaseName>
      <userName>login</userName>
      <password>pass</password>
    </Login>
  </soap:Body>
</soap:Envelope>'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Select @ErrCode,@ResponseText
Exec sp_OADestroy @Object  

我尝试了 MSXML2.XMLHTTP 和 MSXML2.ServerXMLHTTP(以及 .6.0 版本)对象。
错误 ID:-2147024809,带有备注“发送”失败。 The parameter is incorrect

当然Ole Automation Procedures 已启用。

【问题讨论】:

  • 这件事你有成功吗?我现在有同样的问题。
  • @VictorViola 很遗憾没有(

标签: sql tsql soap sql-server-2012 ole


【解决方案1】:

我在整个周末都偶然发现了这个令人讨厌的问题。我个人觉得“替换 DLL”的解决方法很糟糕,所以我尽力想出了一个更安全的解决方案……幸运的是,我实际上找到了其中的两个。

解决方案 1

应用以下 MS HotFix,永久修复问题:

(阅读帖子了解更多信息,并通过 MS 安全渠道通过电子邮件请求修补程序)

解决方案 2

如果您无法应用 HotFix,您仍然可以在发出 SEND 命令时使用稍微不同的语法来完成工作。而不是这个:

Exec @ErrCode=sp_OAMethod @Object, 'send',null,'your-data';

这样做:

Exec @ErrCode=sp_OAMethod @Object, 'send("your-data")';

它适用于任何类型的 HTTP 请求数据:JSONXML 甚至是标准的 application/x-www-form-urlencoded POST 请求。缺点是这样的语法非常难看......而且你必须以这种方式更改所有存储过程。

有关此问题的更多信息,您也可以在我的博客上read this post

【讨论】:

  • 老兄,你刚刚为我节省了 一大堆 的时间。 +1,只是因为我不能给你更多。 (尽管您可能希望将关于用单引号替换引号的部分;我要发送的数据包括 " 作为 XML 的一部分。)
【解决方案2】:

指定 MSXML2.ServerXMLHTTP.3.0 而不是 6.0。

【讨论】:

  • 你应该给出一些描述实际解决方案的答案的理由。
  • 您认为这可能有帮助的任何解释?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2011-06-08
相关资源
最近更新 更多