2017-09-19 47 views
0

いくつかのメソッドをhttpwebrequestからhttpclientに変更しようとしています。私は仕事の大部分をしましたが、これに固執しました。誰かがこれを達成するのに役立つことができます。HttpWebRequestからHttpClientへの切り替え

string url = someurl; 
HttpWebRequest request = CreateRequest(url); 

request.ContentType = "application/x-www-form-urlencoded"; 
request.Method = "POST"; 
request.ServicePoint.Expect100Continue = false; 

string body = @"somestring here."; 
byte[] postBytes = Encoding.UTF8.GetBytes(body); 
request.ContentLength = postBytes.Length; 
Stream stream = request.GetRequestStream(); 
stream.Write(postBytes, 0, postBytes.Length); 
stream.Close(); 

response = (HttpWebResponse)request.GetResponse(); 

このメソッドをHttpClientを使用して変換する必要があります。

これは私が試みたものです。

string url = someurl; 
      var client = new HttpClient();; 


      client.DefaultRequestHeaders 
        .Accept 
        .Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));//ACCEPT header 

      //request.ContentType = "application/x-www-form-urlencoded"; 
      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post,url); 

      string body = @"somestring here..."; 

      var content = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"); 
      request.Content = content; 


      var ss = client.PostAsync(url,content).Result; 
      string str2 = await ss.Content.ReadAsStringAsync(); 

と私はこの部分が機能しなくなっています。

string body = @"somestring here."; 
byte[] postBytes = Encoding.UTF8.GetBytes(body); 
request.ContentLength = postBytes.Length; 
Stream stream = request.GetRequestStream(); 
stream.Write(postBytes, 0, postBytes.Length); 
stream.Close(); 
+0

「PostAsync」が必要なようです...問題の原因となっている部分について詳しく教えてください。 (これは 'CreateRequest'が何をしているのかわからないことを助けるものではありません) –

+0

' HttpClient'は非同期メソッドしか持っていません。非同期呼び出し(.Result、.Wait()..)をブロックする必要がないような非同期コードですか? – Crowcoder

+1

あなたはこれまでに何を試しましたか?このサイトはコードコンバータではありません – Toshi

答えて

0

これは、ほとんどの時間を使用するサンプルのクライアントクラスです。 PostAsyncまたはSendAsyncのいずれかを使用することができます

public class RestClient 
{ 
    public bool IsDisposed { get; private set; } 
    public HttpClient BaseClient { get; private set; } 

    private readonly string jsonMediaType = "application/json"; 

    public RestClient(string hostName, string token, HttpClient client) 
    { 
     BaseClient = client; 
     BaseClient.BaseAddress = new Uri(hostName); 
     BaseClient.DefaultRequestHeaders.Add("Authorization", token); 
    } 

    public async Task<string> PostAsync(string resource, string postData) 
    { 
     StringContent strContent = new StringContent(postData, Encoding.UTF8, jsonMediaType); 
     HttpResponseMessage responseMessage = await BaseClient.PostAsync(resource, strContent).ConfigureAwait(false); 
     responseMessage.RaiseExceptionIfFailed(); 
     return await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); 
    } 

    public async Task<string> SendAsync(HttpMethod method, string resource, string token, string postData) 
    { 
     var resourceUri = new Uri(resource, UriKind.Relative); 
     var uri = new Uri(BaseClient.BaseAddress, resourceUri); 
     HttpRequestMessage request = new HttpRequestMessage(method, uri); 
     request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); 
     if (!string.IsNullOrEmpty(postData)) 
     { 
      request.Content = new StringContent(postData, Encoding.UTF8, jsonMediaType); 
     } 

     HttpResponseMessage response = BaseClient.SendAsync(request).Result; 
     response.RaiseExceptionIfFailed(); 
     return await response.Content.ReadAsStringAsync(); 
    } 

    protected virtual void Dispose(bool isDisposing) 
    { 
     if (IsDisposed) 
     { 
      return; 
     } 
     if (isDisposing) 
     { 
      BaseClient.Dispose(); 
     } 
     IsDisposed = true; 
    } 

    public virtual void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    ~RestClient() 
    { 
     Dispose(false); 
    } 


} 
関連する問題