2015-02-10 119 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(); 
    } 
}