J'ai une application WPF qui consomme les services de l'API Web MVC 2. Créer un wrapper RestClient en utilisant HTTPClient pour appeler des méthodes asynchrones telles que PostAsync et GetAsync. Par exemple mon wrapper de méthode POST serait comme:Appel de la méthode Web API 2 à l'aide de la procédure stockée C# CLR par HTTPClient
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;
}
}
}
}
Qui fonctionne bien. En ce moment j'essaye d'appeler certains des appels d'API par la procédure stockée de C# CLR en créant le projet de base de données de SQL Server.
procédure C# CLR stocké sera comme:
[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;
}
Lorsque je tente de générer la DLL de cette procédure que je reçois construire erreur. Son parce que le compilateur ne reconnaît pas les références de l'Assemblée, comme
System.Net.Http.dll
Comme je l'ai passé par ce fil
Sending HTTP POST request from SQL Server 2012 or SQL CLR C#
J'ai trouvé une solution utiliser HttpWebRequest au lieu de HttpClient. Depuis que j'utilise HttpClient dans mon application, je ne veux pas passer à HttpWebRequest.
Quelqu'un peut-il suggérer d'une autre manière afin que je puisse générer la procédure stockée CLR dll en utilisant HttpClient. Toute aide sera appréciée et merci d'avance.