0

SQL Server 2000 でストアド プロシージャを介して http ポストを送信する際に問題が発生しています。SQL は、http ポストを送信する唯一の方法です。

どうやら [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

問題は、基盤となる O/S (Windows) にあると推測しています。接続を破棄した後、TCP 接続を長時間開いたままにしておく可能性があります。

確認するにはnetstat -a -p tcp、sproc を実行する前後に確認してください。接続を探して、いつ死ぬかを確認します。sproc の実行が完了した後、接続が消えて、TIME_WAIT状態になっていると思います。Windows は、IIRC で 2 ~ 4 分間接続を維持します。これに対処する方法の 1 つは、カスタム HTTP ヘッダー ( Connection: Close) を追加して、リモート サーバーが実行後に接続を閉じるようにすることです。一部の「通常の」コードは次のようになります。これを SQL 関数に適合させる必要があります。 serverXMLHTTP.setRequestHeader("Connection","Close");

これでうまくいかない場合は、Wireshark を使用して接続を追跡し、どのパケットがいつ送信されたかを追跡して、問題を特定します。幸運を

于 2012-05-21T06:40:13.967 に答える