0

У нас возникли проблемы с отправкой сообщения HTTP через хранимую процедуру на SQL Server 2000. SQL - единственный метод, который мы должны отправить почтой http.Http post SQL Server 2000 хранимая процедура

Мы, по-видимому, не отправляем [плавник, 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' 
+0

Можете ли вы проверить вне SQL (в отличие от производства)? Если это так, вы получаете те же проблемы, если запускаете скрипт VB? Вы можете выполнить xp_cmdshell и запустить скрипт? –

+0

Это может быть вариант, хотя возможно ли принудительное закрытие соединения с помощью этой хранимой процедуры? Я думаю, что если соединение принудительно закрыто, это может решить мою проблему. – Imsopov

+0

Не сожалею. Я просто предлагаю способ изолировать проблему в первую очередь. –

ответ

1

Я угадывание проблема связана с базовой O/S (Windows); вероятно, будет поддерживать соединение TCP открытым в течение длительного периода времени после того, как вы удалите соединение.

Для проверки, проверьте netstat -a -p tcp до и после выполнения вашего sproc; найдите связь и посмотрите, когда она умрет. Я предполагаю, что соединение исчезает хорошо после того, как ваш sproc завершен, сидя в состоянии TIME_WAIT. Windows будет поддерживать соединение в течение 2-4 минут IIRC. Один из возможных способов противодействия этому - добавить пользовательский HTTP-заголовок (Connection: Close), чтобы удаленный сервер закроет соединение после выполнения. Некоторый «обычный» код выглядит так: вам просто нужно будет адаптировать его к вашим SQL-функциям: serverXMLHTTP.setRequestHeader("Connection","Close");

Если это не работает, я бы использовал Wireshark для отслеживания соединения и отправки каких-либо пакетов, когда он поможет изолировать проблему. Удачи

+0

Он поддерживал соединение открытым. Мне пришлось перенести результаты из нашего приложения в таблицу, которая будет обрабатываться отдельно. Теперь работать отлично – Imsopov

Смежные вопросы