2015-02-10 8 views
5

से HTTP पोस्ट अनुरोध भेजना SQL सर्वर 2012 से HTTP अनुरोध भेजने के लिए एक आम तौर पर स्वीकार्य मानक तरीका है?SQL सर्वर 2012 या SQL CLR C#

मैं जो करने का प्रयास कर रहा हूं वह एक खोज क्वेरी को संसाधित करने के लिए दूरस्थ सर्वर का उपयोग करना है और फिर परिणामों को SQL Server 2012 डेटाबेस में वापस डालना है। रिमोट सर्वर एक वेब एपीआई प्रदान करता है जो JSON सामग्री के साथ POST अनुरोध स्वीकार करता है।

मेरे पास एक कामकाजी समाधान है, हालांकि SQL सर्वर में कई असेंबली लोड करने की आवश्यकता है। इन विधानसभाओं में से कुछ पूरी तरह से समर्थित नहीं हैं (System.Net.Http.dll जैसे), इस तरह की एक चेतावनी दे:

चेतावनी: Microsoft .NET फ्रेमवर्क विधानसभा 'system.net.http, संस्करण = 4.0। 0.0, संस्कृति = तटस्थ, publickeytoken = b03f5f7f11d50a3a, processorarchitecture = msil। ' आप पंजीकरण कर रहे हैं SQL सर्वर होस्टेड वातावरण में पूरी तरह से परीक्षण नहीं किया गया है और समर्थित नहीं है। भविष्य में, यदि आप इस असेंबली या .NET Framework को अपग्रेड या सेवा करते हैं, तो आपका सीएलआर एकीकरण दिनचर्या काम करना बंद कर सकता है। अधिक जानकारी के लिए कृपया SQL सर्वर पुस्तकें ऑनलाइन देखें।

मैं सोच रहा था कि क्या कोई बेहतर/सुरक्षित तरीका है जिसके लिए इन सभी असेंबली को लोड करने की आवश्यकता नहीं है? मेरी संग्रहीत प्रक्रिया के लिए

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 कॉल करने के पुराने तरीके हैं। –

+1

धन्यवाद! हां, मैंने कोशिश की कि मेरा प्रश्न पोस्ट करने के बाद और यह अतिरिक्त असेंबली लोड किए बिना काम करता है। हालांकि मुझे पूरा यकीन था कि यह ठीक से पहले काम नहीं करता था .. बिल्कुल यकीन नहीं कि मैंने क्या बदल दिया: ओ – dennis

उत्तर

10

जो जैसा असमर्थित विधानसभाओं का उपयोग किए बिना HttpWebRequestHttpClient के बजाय काम करता है का उपयोग करते हुए सुझाव दिया:

[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(); 
    } 
}