SQL SERVER 中 HTTP 请求

本文介绍了如何使用SQLServer来实现定时HTTP请求,确保接口的可用性和IIS上.NetCore RabbitMQ服务的激活。通过创建存储过程执行HTTP GET请求并记录结果,解决了接口因长时间未访问导致的响应慢问题以及服务器重启后MQ服务无法自动启动的问题。此外,还提供了配置定时任务的方法,以保持服务的稳定运行。
摘要由CSDN通过智能技术生成
  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  配置计划作业,定时访问!

要在 SQL Server 进行 HTTP 请求,可以使用 CLR (Common Language Runtime)。CLR 是一种可在 SQL Server 运行的 .NET 程序。 下面是一个示例,演示如何使用 CLR 和 HTTPWebRequest 类从 SQL Server 发出 HTTP GET 请求: 1. 首先,需要创建一个新的 C# 类库项目,添加对 System.Net 和 System.Data.SqlServerCe 的引用。然后编写以下代码: ```csharp using System; using System.Data.SqlTypes; using System.IO; using System.Net; using System.Text; using Microsoft.SqlServer.Server; public partial class HttpRequests { [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)] public static SqlString GetRequest(SqlString url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.Value); request.Method = "GET"; request.ContentType = "application/json"; try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); return result; } } } } catch (WebException ex) { using (HttpWebResponse response = (HttpWebResponse)ex.Response) { if (response == null) { return new SqlString(ex.Message); } else { using (Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } } } } } } ``` 2. 编译并部署 CLR 程序集到 SQL Server 。 3. 在 SQL Server 创建一个新的存储过程,可以使用以下代码: ```sql CREATE PROCEDURE dbo.GetHttpData @url NVARCHAR(MAX), @result NVARCHAR(MAX) OUTPUT AS EXTERNAL NAME HttpRequests.[HttpRequests.HttpRequests].GetRequest; ``` 4. 然后就可以使用以下代码来调用存储过程,从远程服务器获取数据: ```sql DECLARE @result NVARCHAR(MAX); EXEC dbo.GetHttpData 'https://jsonplaceholder.typicode.com/todos/1', @result OUTPUT; SELECT @result; ``` 这将返回一个包含 JSON 数据的字符串。可以使用其他方法对返回的数据进行解析和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值