sp_oagetproperty завершается ошибкой при запуске с использованием компонента Service Broker - PullRequest
0 голосов
/ 14 января 2019

У меня есть хранимая процедура, которая вызывает веб-сервис и получает ответ. Первоначально у меня была проблема с ответами, которые длиннее 4000 символов, но потом я нашел на форумах хитрость вставки данных во временную таблицу. Это работало отлично, пока я не включил мой SP в триггер db, который вызывает этот SP через сервисный брокер. SP начал сбоить с ошибкой, что XML не структурирован, затем я сохранил ответ в текстовом значении (как журнал), и я увидел, что на самом деле ответ снова был ограничен менее чем 4000 символами. Очень странно, почему тот же SP отлично работает, когда я вызываю его вручную, и не работает, когда я вызываю его через сервисный брокер. Ниже часть из SP, которая включает в себя процесс, который я описываю.

declare @obj int
,@responseXml xml
,@status nvarchar(50)
,@statusText nvarchar(1024)
,@method nvarchar(10) = (case when @HttpMethod in ('soap','SOAP') then 'POST' else @HttpMethod end)

exec sp_OACreate 'MSXML2.ServerXMLHttp', @obj out
exec sp_OAMethod @obj, 'Open', null, @method, @Url, false

declare @host nvarchar(1024) = @Url
if @host like 'http://%'
set @host = right(@host, len(@host) - 7)
else if @host like 'https://%'
set @host = right(@host, len(@host) - 8)

if charindex(':', @host) > 0 and charindex(':', @host) < charindex('/', @host)
set @host = left(@host, charindex(':', @host) - 1)
else 
set @host = left(@host, charindex('/', @host) - 1)

declare @envelope nvarchar(max) = cast('' as nvarchar(max)) + '<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mob="http://mobility.sce.webservices.infor.com/"><soapenv:Header/><soapenv:Body><mob:{action}><String_1 xmlns="">{params}</String_1></mob:{action}></soapenv:Body></soapenv:Envelope>'
declare @params nvarchar(max) = cast('' as nvarchar(max))

set @envelope = replace(@envelope, '{action}', @SoapAction)
set @envelope = replace(@envelope, '{params}', @ParamsValues)

set @SoapAction = @SoapAction

exec sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
exec sp_OAMethod @obj, 'setRequestHeader', null, 'Host', @host
exec sp_OAMethod @obj, 'send', null, @envelope

DECLARE @responseText as table(responseText xml)

exec sp_OAMethod @obj, 'responseXml', @responseXml OUTPUT
INSERT INTO @ResponseText (ResponseText) EXEC sp_OAGetProperty @Obj, 'responseText'
exec sp_OADestroy @obj

Я очень ценю вашу помощь, потому что я расстроен и не могу найти решение для этого.

Заранее спасибо и, пожалуйста, не говорите мне использовать CLR

...