上下文中的msxml3.dll sp_OAMethod'send'

时间:2014-11-05 19:48:19

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

Win200 + SQL Server 2005中的工作代码无法在Win2012 + SQL Server 2012 sp1下运行。

我找到的唯一〜真实solution是:

  

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

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

代码很容易抓住肥皂网服务:

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,注释'send'失败。 The parameter is incorrect

当然Ole Automation Procedures已启用。

2 个答案:

答案 0 :(得分:3)

我在整个周末偶然发现了这个令人讨厌的问题。我个人发现“替换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请求数据: JSON XML 甚至 application / x-www-form-urlencoded 用于标准POST请求。缺点是这样的语法非常难看......你必须改变你所有的存储过程。

有关该问题的其他信息,您也可以在我的博客上read this post

答案 1 :(得分:1)

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