2017-06-14 17 views
2

MVC Web API 2のサービスを使用するWPFアプリケーションがあります。HTTPClientを使用してPostAsyncやGetAsyncなどの非同期メソッドを呼び出すRestClientラッパーを作成しました。私のPOSTメソッドラッパーは、次のようになります。HTTPClientでC#CLRストアドプロシージャを使用してWeb API 2メソッドを呼び出します。

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呼び出しの一部を呼び出そうとしています。私は、エラーを構築取得しています。この手順のDLLを生成しようとすると

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

C#CLRストアドプロシージャは次のようになります。 その私が、私は解決策を見つけた

Sending HTTP POST request from SQL Server 2012 or SQL CLR C#

このスレッドを経たようコンパイラがSystem.Net.Http.dll

ようなアセンブリ参照を認識していないので、 HttpClientの代わりにHttpWebRequestを使用します。私は自分のアプリケーション全体でHttpClientを使用しているので、HttpWebRequestに切り替える必要はありません。

誰でも他の方法を提案して、HttpClientを使用してCLRストアドプロシージャDLLを生成できるようにすることはできますか。どんな援助も感謝し、前もって感謝します。

答えて

2

いいえ、HttpClientSystem.Net.Httpで発見され、そのライブラリがsupported .NET Framework librariesの一つではありません。このライブラリを手動で追加することはできますが、UNSAFEに設定する必要があるため、MSに署名する証明書がないため、データベースにTRUSTWORTHY ONを設定する必要があります。また、SQLCLRは純粋なMSILアセンブリのみを許可するため、動作することは保証されていません。混合モードアセンブリは読み込まれません。現在純粋なMSILのアセンブリは、.NET Frameworkの更新プログラムで混在するように変更できます。それがロードされているサポートされていないフレームワークライブラリで発生した場合、プロジェクトは機能しなくなり、そのライブラリを使用しないように書き直す必要があります。

また、SQLCLRで非同期呼び出しを使用しないでください。それらはまた、アセンブリにUNSAFEとマークする必要があり、この環境では一般的には良い考えではありません。

HttpWebRequestHttpWebResponseを使用するのが最も安全で、最も信頼性の高いオプションです。

2

デフォルトでは.netライブラリのサブセットのみがSQLサーバー上で利用可能です。これはthis pageのリストです。

WebRequestは、System.dllによって読み込まれたSystem.Net名前空間の一部です。なぜなら、これをCLRの一部として簡単に使用できる理由と、おそらくあなたが見たソリューションがおそらくそれを使用する理由です。

ページの "Unsupported Libraries"セクションに記載されているように、CLRで使用するために、追加のアセンブリをSQLに読み込むことができます。だから理論的には、HttpClientを使用するために必要なアセンブリをロードすることができますが、拡張機能を使用する場合はいくつかあります。

アセンブリのための潜在的なセキュリティ要件がない限り、理想的に彼らはなどを締結していることもありますのHttpClientはSystem.Net.Http.dll
の一部であり、.PostAsJsonAsyncはSystem.Net.Http.Formatting.dll

の一部です。アセンブリをインポートするときにこれらのチェックを無効にします。

私はこの前に見て回っていましたが、HttpClientを動作させるのにあまり時間をかけていませんでしたが、WebRequestを使用して終了しました。なぜなら、他のアセンブリを外部に配置すること私が作っていたものの -

リンク休憩場合には、これらは、最初のリンクに記載されているライブラリです参考のため
、:

ライブラリ/ SQL Serverの にCLR統合でサポートされている名前空間は、次のとおりです。

  • CustomMarshalers
  • Microsoft.VisualBasic
  • Microsoft.VisualC
  • mscorlib
  • システム
  • System.Configuration
  • System.Data
  • System.Data.OracleClient.dllへ
  • System.Data.SqlXml
  • System.Deployment
  • System.Security
  • System.Transactions
  • System.Web.Services
  • System.Xmlの
  • System.Core.dll
  • System.Xml.Linq.dllが
関連する問題