|
Win2003 + SQL Server 2005的工作代码在Win2012 + SQL Server 2012 sp1下无法工作。
1 ]( z5 K" ?! ^2 I* O, I我发现的唯一的?真正的解决方案是:3 c, H# T: O* S8 \
$ l# D0 a" ?, @- r9 Z: h我将C:\ Windows \ System32 \ msxml3.dll从Server& i- H: p* _' \$ Q" {
2008复制到服务器2012上的同一目录。2012服务器上的问题已解决,可以使用POST和GET发送。
! i8 }# r& K5 ~7 e% i9 k; C/ t. C1 ?" m$ h7 n/ S
但是由于我无法修改服务器,并且msxml3.dll和msxml6.dll均被锁定-我需要了解问题所在并以其他方式应用。
q, x; G1 I2 P! r# k: p2 Q代码很容易获取肥皂网络服务:7 o. p9 v% s) K3 k* l% z! n0 [
Declare @Object as Int;
3 A) T' c- w, b" |" w2 `+ K7 KDeclare @ResponseText as Varchar(8000); ^- ^. h2 ~7 d! U S0 ^7 i& h/ R
Declare @ErrCode Int;
& o M" L$ @0 v5 GExec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;0 h2 c( i+ W4 g/ \, Y
Exec sp_OAMethod @Object, 'open', NULL, 'post','http://example.com/Authentication.asmx','false'6 n3 A( o0 `3 K0 v+ g5 x2 f3 F
Exec sp_OAMethod @Object ,'setRequestHeader' ,NULL ,'Content-Type' ,'text/xml; charset=utf-8'
7 w( P' ^/ ~, |& P* Q, q' U. }! Q6 TExec sp_OAMethod @Object ,'setRequestHeader' ,NULL ,'SOAPAction' ,'"http://www.example.com/Login"'
( W1 C$ D! I/ v9 Q9 f+ ~2 gExec @ErrCode=sp_OAMethod @Object, 'send',null,') j; E# @9 i2 X: @/ I
0 J6 }' n9 b/ u% Q' `, F
& C+ D1 Z/ ^. H$ J( b( i* [ db1
2 `% r6 {; ^% S5 c3 t' v" y5 ] login
7 [/ A9 J: d9 i/ ^% D: r pass
$ q" n" m4 A! L( I; _; r , j$ P. z+ |8 q
6 k7 E5 I2 ~% J+ O F
'
5 a. x5 T2 s" G8 ~( {5 \3 w) G0 MExec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT2 R$ w! Y+ [2 b. O
Select @ErrCode,@ResponseText
" f' q4 [. E! E: n3 PExec sp_OADestroy @Object- ] h: z2 r: r2 T
我同时尝试了MSXML2.XMLHTTP和MSXML2.ServerXMLHTTP(以及.6.0版本)对象。" X* h n5 O7 Q1 S) y
错误ID:-2147024809,带有备注“发送”失败。The parameter is incorrect。
8 l8 y& u9 i* V. v' b* u0 y0 c( w当然Ole Automation Procedures启用了。
% y+ H, A2 i9 V! P1 M 3 Y: f, Q* U8 \3 s1 G# K3 E
解决方案: F# E8 z6 M5 Z; [# b! C
. N# ?* J3 S r: w- X
& w+ ]8 Q. J& p- f* s* C, w! ], a, Y" a& C4 B4 g, c
我整个周末都偶然发现了这个令人讨厌的问题。我个人发现“替换DLL”的解决方法很糟糕,所以我尽力提出了一个更安全的解决方案…幸运的是,我实际上找到了其中两个。
) ] S- G/ w; Z, G解决方案1
' k. n4 s# k+ N: Y0 T( I应用以下MS HotFix,可以永久解决此问题:
3 }, l& Z, Q' e" y( [% chttps://support.microsoft.com/zh-CN/help/2968741/error-0x80070057-when-sql-server-communicates-to-a-web-server-using-st
) ?! H8 Z- A1 b2 Y9 {4 _8 b$ O" U6 x+ L" y2 l# ?
(请阅读该帖子以获取更多信息,并通过MS安全通道通过电子邮件请求此修补程序)4 \- e+ K8 }& t' ?1 G1 O
解决方案2; h+ J4 k$ E9 N" W7 v1 e- ~
如果您无法应用HotFix,则在发出SEND命令时,仍可以通过使用稍有不同的语法来完成作业。代替这个:
$ c( t) F5 h* C# o: ~) f4 H0 CExec @ErrCode=sp_OAMethod @Object, 'send',null,'your-data';
- B$ _+ m ?4 c% f做这个:# u2 b! h/ Q# j. b: @! p& t
Exec @ErrCode=sp_OAMethod @Object, 'send("your-data")';- l, b6 O$ s/ N& S. y4 K
它适用于任何类型的HTTP请求数据: JSON , XML 甚至标准POST请求的 application / x-www-form-3 _. \, r% _! ?4 M7 t4 d
urlencoded 。缺点是这种语法非常丑陋……您必须以这种方式更改所有存储过程。 |
|