Спасибо всем, у меня это работает.На самом деле имя сертификата должно быть явно указано в хранимой процедуре, как показано ниже, который отсутствовал в моей реализации.
EXEC @hResult = sp_OAMethod
@objectID,
'setOption',
NULL,
3,
'LOCAL_MACHINE\My\'Certificate Name';
Ниже приведена полная реализация хранимой процедуры для вызова веб-службы из хранимой процедуры.
CREATE PROCEDURE [dbo].[Usp_INT_SendHttpRequest]
@URI VARCHAR(2000) = '',
@methodName VARCHAR(50) = '',
@requestBody VARCHAR(8000) = '',
@SoapAction VARCHAR(255),
@UserName NVARCHAR(100), -- Domain\UserName or UserName
@Password NVARCHAR(100),
@responseText VARCHAR(8000) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
IF @methodName = ''
BEGIN
SELECT FailPoint = 'Method Name must be set';
RETURN;
END;
SET @responseText = 'FAILED';
DECLARE @objectID INT;
DECLARE @hResult INT;
DECLARE @source VARCHAR(255), @desc VARCHAR(255);
EXEC @hResult = sp_OACreate
'MSXML2.ServerXMLHTTP',
@objectID OUT;
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'Create failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
EXEC @hResult = sp_OAMethod
@objectID,
'setOption',
NULL,
3,
'LOCAL_MACHINE\My\ClientSignedByDevCA';
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'Set Certificate failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
-- open the destination URI with Specified method
EXEC @hResult = sp_OAMethod
@objectID,
'open',
NULL,
@methodName,
@URI,
'false',
@UserName,
@Password;
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'Open failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
-- set request headers
EXEC @hResult = sp_OAMethod
@objectID,
'setRequestHeader',
NULL,
'Content-Type',
'text/xml;charset=UTF-8';
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'SetRequestHeader failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
-- set soap action
EXEC @hResult = sp_OAMethod
@objectID,
'setRequestHeader',
NULL,
'SOAPAction',
@SoapAction;
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'SetRequestHeader failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
DECLARE @len INT;
SET @len = LEN(@requestBody);
EXEC @hResult = sp_OAMethod
@objectID,
'setRequestHeader',
NULL,
'Content-Length',
@len;
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'SetRequestHeader failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
EXEC @hResult = sp_OAMethod
@objectID,
'send',
NULL,
@requestBody;
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'Send failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
DECLARE @statusText VARCHAR(1000), @status VARCHAR(1000);
-- Get status text
EXEC sp_OAGetProperty
@objectID,
'StatusText',
@statusText OUT;
EXEC sp_OAGetProperty
@objectID,
'Status',
@status OUT;
SELECT @status,
@statusText,
@methodName;
-- Get response text
EXEC sp_OAGetProperty
@objectID,
'responseText',
@responseText OUT;
IF @hResult <> 0
BEGIN
EXEC sp_OAGetErrorInfo
@objectID,
@source OUT,
@desc OUT;
SELECT hResult = CONVERT(VARBINARY(4), @hResult),
source = @source,
description = @desc,
FailPoint = 'ResponseText failed',
MedthodName = @methodName;
GOTO destroy;
RETURN;
END;
destroy:
EXEC sp_OADestroy
@objectID;
SET @responseText = 'SUCCESS'
SET NOCOUNT OFF;
END;