1. 程式人生 > 其它 >SQL SERVER 中 HTTP 請求

SQL SERVER 中 HTTP 請求

技術標籤:SQL SERVERsql

  1. 背景
    對於大多數介面,我們需要監控其是否可以正常訪問;
    或者再IIS部署的介面,由於長時間不訪問(預設20分鐘)、重啟,介面處於待啟用狀態,再第一次請求的時候會變成慢,需要有個定時器定時訪問
  2. 目前業務場景
    .Net Core 下 RabbitMQ的消費服務,正常IIS部署上去後,無法註冊、啟動MQ服務,需要訪問其中介面方法一次(HeathCheck),才能註冊,已經設定此站點IIS不自動回收,但是伺服器重啟會導致MQ服務不能啟動。
  3. 解決方案
    通過SQL Server 中對http請求,來做定時服務,並記錄請求結果
  4. 設計 實現(GET)

    1>http 請求配置表和日誌記錄表
    -- 請求配置
    CREATE TABLE [dbo].[HttpTimerConfig](
    	[HttpId] [int] IDENTITY(1,1) NOT NULL,
    	[HttpName] [varchar](500) NULL,
    	[HttpRequestUrl] [varchar](500) NULL,
    	[IsDelete] [bit] NOT NULL CONSTRAINT [DF_HttpTimerConfig_IsDelete]  DEFAULT ((0)),
    	[Remark] [nvarchar](500) NULL,
    	[CreateTime] [datetime] NULL CONSTRAINT [DF_HttpTimerConfig_CreateTime]  DEFAULT (getdate()),
     CONSTRAINT [PK_HttpTimerConfig_1] PRIMARY KEY CLUSTERED 
    (
    	[HttpId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    --請求記錄表
    CREATE TABLE [dbo].[HttpRequestLog](
    	[LogId] [uniqueidentifier] NOT NULL CONSTRAINT [DF_httpRequestLog_LogId]  DEFAULT (newid()),
    	[RequestUrl] [varchar](500) NULL,
    	[HttpType] [varchar](50) NULL,
    	[RequestName] [nvarchar](500) NULL,
    	[RequestTime] [datetime] NULL,
    	[ResponseTime] [datetime] NULL,
    	[ResponseStatus] [int] NULL,
    	[ResponseText] [nvarchar](max) NULL,
    	[CreateTime] [nchar](10) NULL,
     CONSTRAINT [PK_httpRequestLog] PRIMARY KEY CLUSTERED 
    (
    	[LogId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO

    2> 新建Http Get訪問核心儲存過程(參照網路)

    --1 開啟Sql Server 通訊配置--
    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ole Automation Procedures', 1;
    GO
    RECONFIGURE;
    GO
    EXEC sp_configure 'Ole Automation Procedures';
    GO
    
    --2 建立請求http Get方式 儲存過程
    
    CREATE PROCEDURE PRO_GET_HttpRequestData(
    	@URL varchar(500),
    	@status int=0 OUT,
    	@returnText varchar(2000)='' OUT
    )
    AS
    BEGIN
    	DECLARE @object int,
    	@errSrc int
    	/*初始化對*/
    	EXEC @status = SP_OACreate 'Msxml2.ServerXMLHTTP.3.0', @object OUT
    	IF @status <> 0
    	BEGIN
    	 EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
    	 RETURN
    	END
     
    	/*建立連結*/
    	EXEC @status= SP_OAMethod @object,'open',NULL,'GET',@URL
    	IF @status <> 0
    	BEGIN
    	 EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
    	 RETURN
    	END
    	EXEC @status=SP_OAMethod @object,'setRequestHeader','Content-Type','application/x-www-form-urlencoded'
    	/*發起請求*/
    	EXEC @status= SP_OAMethod @object,'send',NULL 
    	IF @status <> 0 
    	BEGIN 
    	 EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
    	 RETURN
    	END
         
    	/*獲取返回*/
    	EXEC @status= SP_OAGetProperty @object,'responseText',@returnText OUT
    	IF @status <> 0 
    	BEGIN 
    	 EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
    	 RETURN
    	END
    END;
    

    3> 新建獲取配置訪問http和記錄日誌的儲存過程

    CREATE PROCEDURE  PRO_HttpRequestCammand
    AS
    BEGIN
       DECLARE @returnText VARCHAR(500);
       DECLARE @status INT;
       DECLARE @RequestTime DATETIME;
       DECLARE @ResponseTime DATETIME;
       ---------------------------------
       DECLARE  @HttpName VARCHAR(500);
       DECLARE  @HttpRequestUrl VARCHAR(500)
       DECLARE  Cur_HttpInfo CURSOR FOR
       SELECT   HttpName,HttpRequestUrl  FROM HttpTimerConfig WHERE IsDelete=0
       OPEN Cur_HttpInfo
       FETCH NEXT FROM Cur_HttpInfo  INTO @HttpName,@HttpRequestUrl
       WHILE @@FETCH_STATUS = 0
        BEGIN
    	   SET @RequestTime=GETDATE();
    	   EXEC PRO_GET_HttpRequestData @HttpRequestUrl, @status OUTPUT, @returnText OUTPUT;
    	   SET @ResponseTime=GETDATE();
    	   INSERT HttpRequestLog(RequestUrl,HttpType,RequestName,RequestTime,ResponseTime,ResponseStatus,ResponseText)
    	   VALUES(@HttpRequestUrl,'GET',@HttpName,@RequestTime,@ResponseTime,@status,@returnText)
           FETCH NEXT FROM Cur_HttpInfo Into  @HttpName,@HttpRequestUrl
        END
    CLOSE Cur_HttpInfo
    DEALLOCATE Cur_HttpInfo 
    
    END

    4>配置HttpTimerConfig 資料

    5> 執行PRO_HttpRequestCammand 過程後,就會在HttpRequestLog 記錄日誌

  5. 當然可以把PRO_HttpRequestCammand 配置計劃作業,定時訪問!