我想从T-SQL向Web服务发送HTTP请求。如果无法访问Web服务,那么我想在500ms之后取消操作。这样程序就不会卡住了。
因此,我正在使用OLE对象MXSML2.ServerXMLHttp,并且正在尝试使用setTimeouts方法(请参见Microsoft Documentation)。这种方法行得通,但不幸的是,它仅在4秒后返回。
setTimeouts方法期望以毫秒为单位的4个参数,这些参数声明与http请求有关的多个操作的超时(请参阅文档)。即使将参数设置为1ms,它也只会在4秒后返回。我想念什么?
我可以看到setTimeouts至少做了一些事情,因为http请求的状态代码和就绪状态保持为0。如果我注释掉setTimeouts方法调用,则会得到一个普通的http响应,状态代码为200且就绪状态4。
这是我正在使用的过程:
ALTER PROCEDURE [dbo].[TestWebRequest]
AS
BEGIN
DECLARE @obj int,
@url VarChar(300),
@response VarChar(MAX),
@statusCode int = -1,
@readyState int = -1
DECLARE @t1 DateTime,
@t2 DateTime,
@elapsed_ms int
SET @url = 'http://httpstat.us/200?sleep=5000'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
EXEC sp_OASetProperty @obj, 'setTimeouts', '1', '1', '1', '1'
EXEC sp_OAMethod @obj, 'Open', NULL, 'GET', @url, false
SET @t1 = GETDATE()
EXEC sp_OAMethod @obj, 'send'
SET @t2 = GETDATE()
SET @elapsed_ms = (SELECT DATEDIFF(millisecond,@t1,@t2))
EXEC sp_OAGetProperty @obj, 'readyState', @readyState OUT
EXEC sp_OAGetProperty @obj, 'status', @statusCode OUT
DECLARE @src nvarchar(200), @desc nvarchar(2000) = ''
EXEC sp_OAGetErrorInfo @obj, @src OUT, @desc OUT
EXEC sp_OADestroy @obj
PRINT 'Error: ' + @desc
PRINT 'Elapsed Time: ' + CONVERT(varchar, @elapsed_ms) + ' ms'
PRINT 'Ready State ' + CONVERT(varchar, @readyState)
PRINT 'StatusCode: ' + CONVERT(varchar, @statusCode)
END
我得到的是这个结果:
Error: The data necessary to complete this operation is not yet available. Elapsed Time: 4636 ms Ready State 1 StatusCode: -1
我希望经过的时间低于500毫秒。
如果我注释掉setTimeouts方法,将显示以下结果:
Elapsed Time: 5173 ms Ready State 4 StatusCode: 200