ServerXMLHttp:为什么setTimeouts不能在毫秒内取消请求?

时间:2019-04-11 12:54:51

标签: tsql timeout serverxmlhttp

我想从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

0 个答案:

没有答案