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

rev*_*oua 5 sql t-sql soap ole sql-server-2012

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

我找到的唯一真正的解决方案是:

我将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  
Run Code Online (Sandbox Code Playgroud)

我尝试了MSXML2.XMLHTTP和MSXML2.ServerXMLHTTP(以及.6.0版本)对象.
错误ID:-2147024809,注释'send'失败.The parameter is incorrect.

当然Ole Automation Procedures是启用了.

Dar*_*eal 3

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

解决方案1

应用以下 MS HotFix,可以永久解决该问题:

(阅读该帖子以获取更多信息,并通过 MS 安全通道通过电子邮件请求修补程序)

解决方案2

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

Exec @ErrCode=sp_OAMethod @Object, 'send',null,'your-data';
Run Code Online (Sandbox Code Playgroud)

做这个:

Exec @ErrCode=sp_OAMethod @Object, 'send("your-data")';
Run Code Online (Sandbox Code Playgroud)

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

有关该问题的更多信息,您还可以阅读我博客上的这篇文章