2017-09-19 6 views
0

J'essaie de déplacer certaines méthodes de httpwebrequest vers httpclient. J'ai fait la majeure partie du travail mais je suis resté avec celui-ci. Quelqu'un peut-il aider à atteindre cet objectif?Passage de 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(); 

Je dois convertir cette méthode en utilisant HttpClient.

C'est ce que j'ai essayé.

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(); 

et je ne reçois pas cette partie de travailler.

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

Bien il semble que vous voulez probablement 'PostAsync' ... s'il vous plaît donner plus de détails quant à la partie qui vous cause des problèmes. (Cela n'aide pas que nous ne sachions pas ce que fait 'CreateRequest'.) –

+0

' HttpClient' n'a que des méthodes asynchrones. Est-ce que votre code async est tel que vous n'aurez pas besoin de bloquer les appels asynchrones (.Result, .Wait() ..)? – Crowcoder

+1

Qu'avez-vous essayé jusqu'à présent? Ce site n'est pas un convertisseur de code – Toshi

Répondre

0

Voici l'exemple de classe de client que j'utilise la plupart du temps. Vous pouvez utiliser soit PostAsync ou 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); 
    } 


}