SQL SERVER 中 HTTP 請求
阿新 • • 發佈:2021-02-09
技術標籤:SQL SERVERsql
- 背景
對於大多數介面,我們需要監控其是否可以正常訪問;
或者再IIS部署的介面,由於長時間不訪問(預設20分鐘)、重啟,介面處於待啟用狀態,再第一次請求的時候會變成慢,需要有個定時器定時訪問 - 目前業務場景
.Net Core 下 RabbitMQ的消費服務,正常IIS部署上去後,無法註冊、啟動MQ服務,需要訪問其中介面方法一次(HeathCheck),才能註冊,已經設定此站點IIS不自動回收,但是伺服器重啟會導致MQ服務不能啟動。 - 解決方案
通過SQL Server 中對http請求,來做定時服務,並記錄請求結果 - 設計 實現(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 記錄日誌 -
當然可以把PRO_HttpRequestCammand 配置計劃作業,定時訪問!