1

HttpClient (別名Web APIクライアント)を使用してRESTfullサービスを利用しています。サービスでは、各操作でセッションを確立し(ログインを介して)、その後破棄する(ログアウトを介して)必要があります。したがって、サービスAを消費するための呼び出しは次のようになります(擬似コード)

// setup
create auth dictionary authDict
create authenticationContent using FormUrlEndodeContent(authDict)
create cookieContainer
create HttpClientHandler...
create HttpClient

// login
await httpClient.PostAsync(LoginUrl, authenticationContent);
do error checking

// perform Operation A
await httpClient.....post...or...get...
extract data, process it, tranform it, get a cup of coffee, etc, etc
populate OperationAResult

// logout
await httpClient.GetAsync(LogoutUrl);

// return result
return OperationAResult

私の質問は、セットアップ、ログイン、およびログアウトをさまざまな操作に簡単に再利用するにはどうすればよいですか?Action <>を実行するメソッドを作成する必要があります。作成する場合、操作が順番に行われるようにするにはどうすればよいですか?

4

2 に答える 2

1

おそらく最も簡単な方法は、ラッパークラスを作成することです。

public class MyHttpClient
{
  private HttpClient _client = new HttpClient();
  private MyHttpClientSetup _setup;

  public MyHttpClient(MyHttpClientSetup setup)
  {
    this._setup = setup;
  }

  private void HttpLogin() 
  { 
    // .. custom login stuff that uses this._setup
  }     

  private void HttpLogout() 
  { 
    // .. custom logout stuff that uses this._setup
  }     

  public void Reset()
  {
    this._client = new HttpClient();
  }

  // Wrapped Properties from the private HttpClient (1 example)
  public Uri BaseAddress 
  { 
    get{ return this._client.BaseAddress;} 
    set{ this._client.BaseAddress = value;} 
  }

  // Wrapped HttpMethods (1 example)
  // Extremely poorly written, should be delegated properly
  // This is just a bad example not using Task properly
  public Task<HttpResponseMessage> DeleteAsync(string requestUri)
  {
    this.HttpLogin();
    Task<HttpResponseMessage> result = this._client.DeleteAsync(requestUri);
    this.HttpLogout();
    return result;
  }


  public class MyHttpClientSetup
  {
    // Properties required for setup;
  }
}
于 2012-10-24T01:32:28.203 に答える
1

このようなものを透過的に処理するための新しいMessageHandlerを作成できる場合があります。

public class ConnectionHandler : DelegatingHandler {

        public HttpClient HttpClient {get;set;}

        public TestHandler(HttpMessageHandler handler) {
            this.InnerHandler = handler;
        }
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            // Do your login stuff here
            return base.SendAsync(request, cancellationToken)  // Make your actual request
              .ContinueWith(t => {
                            // Do your logout stuff here
                            } 
        }
    }

次に、HttpClientの単一のインスタンスを使用してすべてのリクエストを実行できます。ハンドラーを要求/応答パイプラインに追加するには、通常のHttpClientHandlerを作成し、それをDelegatingHandlerのInnerHandlerプロパティに割り当ててから、新しいハンドラーをHttpClientのコンストラクターに渡す必要があります。その時点から、HttpClientを介して行われたすべての要求は、ConnnectionHandlerを介してルーティングされます。

  var connectionHandler = new ConnectionHandler(new HttpClientHandler());
  var client = new HttpClient(connectionHandler);
  connectionHandler.HttpClient = client;

  var response = client.GetAsync("http://example.org/request").Result;

単一のHttpClientインスタンスを使用する利点は、DefaultRequestHeadersを再指定し続ける必要がないことです。また、HttpClientを破棄するとTCP接続が強制終了されるため、次のリクエストでTCP接続を再度開く必要があります。

于 2012-10-24T01:46:50.680 に答える