我有一個使用MVC Web API 2的服務的WPF應用程序。使用HTTPClient調用異步方法(如PostAsync和GetAsync)創建RestClient包裝器。對於前我的POST方法包裝將如下所示:使用c#調用Web API 2方法HTTPClient使用CLR存儲過程
using (var client = new HttpClient(new HttpClientHandler()
{ AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip }))
{
var content = new FormUrlEncodedContent(postObject);
SetupClient(client, methodName, apiUrl, postObject, headerContent);
if (apiKey != null && appId != null)
await SetAuthorizationHeader(client, methodName, apiUrl, appId, apiKey, content).ConfigureAwait(false);
using (HttpResponseMessage response = Task.Run(() => client.PostAsync(apiUrl, content)).Result)
{
response.EnsureSuccessStatusCode();
using (HttpContent httpContent = response.Content)
{
if (response.IsSuccessStatusCode)
{
result = response.Content.ReadAsAsync<T>().Result;
}
}
}
}
哪個工作正常。現在我正嘗試通過創建SQL Server數據庫項目來通過C#CLR存儲過程調用一些API調用。
C#CLR存儲過程會像:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SQLRestClient(SqlString weburl, SqlString postBody, SqlString appIdString, SqlString apiKeyString, SecureString baseAddress, out SqlString returnval)
{
string apiUrl = Convert.ToString(weburl);
string baseAddressString = Convert.ToString(baseAddress);
string result = string.Empty;
var appId = ConvertToSecureString(Convert.ToString(appIdString));
var apiKey = ConvertToSecureString(Convert.ToString(apiKeyString));
try
{
string methodName = HttpMethod.Post.Method.ToUpper();
using (var client = new HttpClient(new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
}))
{
var content = new FormUrlEncodedContent(postObject);
SetupClient(client, methodName, apiUrl, postObject, headerContent);
if (apiKey != null && appId != null)
await SetAuthorizationHeader(client, methodName, apiUrl, appId, apiKey, content).ConfigureAwait(false);
using (HttpResponseMessage response = Task.Run(() => client.PostAsync(apiUrl, content)).Result)
{
response.EnsureSuccessStatusCode();
using (HttpContent httpContent = response.Content)
{
if (response.IsSuccessStatusCode)
{
result = response.Content.ReadAsStringAsync();
}
}
}
}
}
catch (Exception ex)
{
SqlContext.Pipe.Send(ex.Message.ToString());
}
returnval = result;
}
當我嘗試生成此過程中我得到建立自己的錯誤的DLL。 它,因爲編譯器不能識別集引用如
System.Net.Http.dll
當我通過這個線程
Sending HTTP POST request from SQL Server 2012 or SQL CLR C#
我找到了解決辦法了使用HttpWebRequest而不是HttpClient。由於我一直在我的應用程序中使用HttpClient,我不想切換到HttpWebRequest。
任何人都可以提出任何其他方式,以便我可以通過使用HttpClient生成CLR存儲過程DLL。任何幫助將不勝感激,並提前致謝。