2015-02-10 48 views
5

是否有从SQL Server 2012发送HTTP请求的普遍接受的标准方式?从SQL Server 2012或SQL CLR发送HTTP POST请求C#

我想要做的是使用远程服务器来处理搜索查询,然后将结果插回到SQL Server 2012数据库中。远程服务器提供了一个Web API,它接受带有JSON内容的POST请求。

我有一个工作解决方案,但是需要将几个程序集加载到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 
     } 
    } 
} 
+3

你试过'WebClient'或'HttpWebRequest'而不是“HttpClient” - 我不知道这些是否会起作用,但这些都是在.NET中进行HTTP调用的老式方法。 – 2015-02-10 15:40:00

+1

谢谢!是的,我发布了我的问题后试过,并且它在不加载其他程序集的情况下工作。虽然我很确定它以前不能正常工作..不完全确定我改变了什么:o – dennis 2015-02-10 15:51:38

回答

10

像乔使用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(); 
    } 
}