代码之家  ›  专栏  ›  技术社区  ›  dennis

从SQL Server 2012或SQL CLR C发送HTTP POST请求#

  •  9
  • dennis  · 技术社区  · 9 年前

    从SQL Server 2012发送HTTP请求是否有公认的标准方法?

    我试图做的是使用远程服务器处理搜索查询,然后将结果插入SQL server 2012数据库。远程服务器提供了一个web api,它接受POST请求和JSON内容。

    我有一个可行的解决方案,但需要将多个程序集加载到SQL Server中。其中一些程序集不完全受支持(例如System.Net.Http.dll),会发出如下警告:

    警告:Microsoft.NET Framework程序集“system.NET.http,version=4.0.0.0,culture=neutral,publickeytoken=b03f5f7f11d50a3a,processorarchitecture=msil”您正在注册的未在SQL Server宿主环境中进行完全测试,因此不受支持。将来,如果升级或维护此程序集或.NET Framework,CLR集成例程可能会停止工作。有关详细信息,请参阅SQL Server联机丛书。

    我想知道是否有一种更好/更安全的方法不需要加载所有这些组件?

    存储过程的CLR代码:

    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void SendSearchRequestProcedure (string query, string table)
    {
        RunAsync(query,table).Wait();
    }
    
    static async Task RunAsync(string query, string table)
    {
        using (var client = new HttpClient())
        {
            HttpResponseMessage response;
    
            client.BaseAddress = new Uri("http://localhost:9000/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
            var search = new Search() { Query = query, Table = table };
    
            response = await client.PostAsJsonAsync("api/search/", search);
    
            if (!response.IsSuccessStatusCode)
            {
                // handle error
            }
        }
    } 
    
    1 回复  |  直到 9 年前
        1
  •  16
  •   dennis    9 年前

    就像乔建议的那样 HttpWebRequest 而不是 HttpClient 无需使用不支持的程序集即可工作:

    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void SendRequest (string query, string table)
    {
        string address = "http://localhost:9000/api/search";
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(address);
        request.ContentType = "application/json; charset=utf-8";
        request.Method = "POST";
    
        using (var streamWriter = new StreamWriter(request.GetRequestStream()))
        {
            string json = "{\"Query\":\""+query+"\",\"Table\":\""+table+"\"}";
    
            streamWriter.Write(json);
            streamWriter.Flush();
        }
    
        var httpResponse = (HttpWebResponse)request.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
        }
    }