0

我们在通过 SQL Server 2000 上的存储过程发送 http post 时遇到问题。SQL 是我们必须发送 http post 的唯一方法。

我们显然没有发送 [fin , ack] 并且连接没有足够快地关闭。谁能告诉我问题是什么?

CREATE procedure HTTP_POST( @sUrl varchar(200), @response varchar(8000) out)
As

Declare
@obj int
,@hr int
,@status int
,@msg varchar(255)

exec @hr = sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT

exec @hr = sp_OAMethod @obj, 'open', NULL, 'POST', @sUrl, false
if @hr <>0 begin set @msg = 'sp_OAMethod Open failed' goto eh end

exec @hr = sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type',
'application/x-www-form-urlencoded'
if @hr <>0 begin set @msg = 'sp_OAMethod setRequestHeader failed' goto
eh end

exec @hr = sp_OAMethod @obj, send, NULL, ''
if @hr <>0 begin set @msg = 'sp_OAMethod Send failed' goto eh end

exec @hr = sp_OAGetProperty @obj, 'status', @status OUT
if @hr <>0 begin set @msg = 'sp_OAMethod read status failed' goto
eh
end

if @status <> 200 begin set @msg = 'sp_OAMethod http status ' +
str(@status) goto eh end

exec @hr = sp_OAGetProperty @obj, 'responseText', @response OUT
if @hr <>0 begin set @msg = 'sp_OAMethod read response failed' goto
eh end

exec @hr = sp_OADestroy @obj
return
eh:

exec @hr = sp_OADestroy @obj
return
GO

我这样调用存储过程

exec HTTP_POST 'http://123.123.123.123/example.webservice?time=201205021000000'
4

1 回答 1

1

我猜问题出在底层操作系统(Windows)上;处理连接后,很可能会长时间保持 TCP 连接打开。

要验证,请netstat -a -p tcp在执行存储过程之前和之后检查;寻找一个连接,看看它什么时候死掉。我猜想在你的 sproc 完成执行后,连接就会消失,处于一个TIME_WAIT状态。Windows 将保持连接活动 2-4 分钟 IIRC。一种可能解决此问题的方法是添加自定义 HTTP 标头 ( Connection: Close),以便远程服务器在执行后关闭连接。一些“常规”代码如下所示,您只需将其调整为您的 SQL 函数: serverXMLHTTP.setRequestHeader("Connection","Close");

如果这些都不起作用,我会使用 Wireshark 来跟踪连接以及何时发送哪些数据包以帮助隔离问题。祝你好运

于 2012-05-21T06:40:13.967 回答