_Maxxx_ Ответов: 2

Использование MSXML2 из SP на SQL 2014


У меня есть SP, использующий MSXML2 для вызова веб-службы.
Он работает на моей локальной машине с использованием SQL Server 2008R2
Он не работает на моем сервере, используя SQL Server 2014.

Запуск того же MSXML2 из Javascript-программы из командной строки работает как на локальной машине, так и на сервере.

Служба SQL Server работает под управлением пользователя Admin на обеих машинах.

Вот вам и SQL:

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);
Declare @Status as int;
Declare @Body as varchar(8000) =
'{"someParameterName": ["AAAAAAAA" ],"Message": "Here is a message I am sending","securityId": "DA6AC379-703F-4BCC-9B0B-8DBAF87EB5C6","type": "send_message"}'

Declare @BodyLength int = LEN(@Body)
Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'setProxy', '2', 'http://localhost:8888',''
Exec sp_OAMethod @Object, 'open', NULL, 'post',
    'https://api.theUrl.com/external/TheMessageApi',
    'false'

Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-LEngth', @BodyLength

Exec sp_OAMethod @Object, 'send', null , @Body


Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Exec sp_OAMethod @Object, 'status', @status OUTPUT
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

Select @ResponseText as Response, @Status as Status

Exec sp_OADestroy @Object


На моем локальном компьютере я вижу текст ответа и статус 200
На сервере я вижу Null, Null

Я ценю, что это немного специфично - но я в недоумении, на что еще смотреть!

Я попробовал установить Fiddler - но он не ловит трафик, даже когда вызов работает!

Любой совет с благодарностью принимаю!

2 Ответов

Рейтинг:
2

_Maxxx_

Ну, ладно, похоже, мне придется ответить на него самому.

Оказывается, что MSXML6.dll в Windows 7 это отличается от MSXML6.dll в Windows Server 2012

Я не знаю, в чем разница, но метод "отправить" терпит неудачу в версии 2012 года с ошибкой
Msxml6.dll 0x80070057

что означает "параметр неверен".

Та же проблема и с MSCML3.dll!

Итак-я скопировал две библиотеки DLL из Windows\System32 (с моей рабочей станции на сервер), дал ей быструю перезагрузку и бинго!

Урок усвоен - я должен был смотреть на коды возврата от каждого вызова библиотеки DLL - я бы отследил проблему раньше!


Но теперь я могу вызвать веб-службу из своего триггера SQL Server, так что я счастливый парень!


Рейтинг:
2

Zsolt v

использовать:

DECLARE @request varchar(max)
SET @request = 'send("' + REPLACE(@Body, '"', '''') + '")'
Exec sp_OAMethod @Object, @request

INSERT INTO @result
 EXEC sp_OAGetProperty @Object, 'responseText'


CHill60

Проблема была решена более 6 месяцев назад - в коде не было ничего плохого, это была неправильная DLL.