2017-12-22 15 views
2

私はHttpWebRequestから移行しているので、私はHttpClientを使ってプロジェクトの拡張クラスを作成しています。HttpClient PostAsyncパラメータを正しく使用するにはどうすればよいですか?

POSTリクエストを行う際に、通常の文字列をパラメータとして送信するにはどうすればよいですか?いいえjsonまたは何か単純な文字列。

これはこれまでのようです。

static class HttpClientExtension 
    { 
     static HttpClient client = new HttpClient(); 
     public static string GetHttpResponse(string URL) 
     { 
      string fail = "Fail"; 
      client.BaseAddress = new Uri(URL); 
      HttpResponseMessage Response = client.GetAsync(URL).GetAwaiter().GetResult(); 
      if (Response.IsSuccessStatusCode) 
       return Response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 
      else 
       return fail; 
     } 

     public static string PostRequest(string URI, string PostParams) 
     { 
      client.PostAsync(URI, new StringContent(PostParams)); 
      HttpResponseMessage response = client.GetAsync(URI).GetAwaiter().GetResult(); 
      string content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 
      return content; 
     } 
    } 

あなたは

client.PostAsync(URI, new StringContent(PostParams)); 

のようにこれを見ている場合は、私はちょうど新しいStringContentを作成し、その中に文字列を渡す試み、応答が見つからない404ページを返されたことがわかります。 Post.Async()を正しく使用するにはどうすればいいですか?私は文字列またはバイト配列を送信するのですか? HttpWebRequestのをあなたが..行われ、次のPostRequestでこの

public static void SetPost(this HttpWebRequest request, string postdata) 
     { 
      request.Method = "POST"; 
      byte[] bytes = Encoding.UTF8.GetBytes(postdata); 

      using (Stream requestStream = request.GetRequestStream()) 
       requestStream.Write(bytes, 0, bytes.Length); 
     } 

答えて

1

のようにそれを行うだろうので

client.PostAsync(URI, new StringContent(PostParams)); 
HttpResponseMessage response = client.GetAsync(URI).GetAwaiter().GetResult(); 

POSTの応答をキャプチャしません。

リファクタリング

public static string PostRequest(string URI, string PostParams) {    
    var response = client.PostAsync(URI, new StringContent(PostParams)).GetAwaiter().GetResult(); 
    var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 
    return content; 
} 

HttpClientは、主に以下のように(パッケージNgonzalez.ImageProcessorCoreを使用して)私が働いている

public static async Task<string> PostRequestAsync(string URI, string PostParams) {    
    var response = await client.PostAsync(URI, new StringContent(PostParams)); 
    var content = await response.Content.ReadAsStringAsync(); 
    return content; 
} 
+0

は、どのように私は、返される文字列のネタをつかむん? –

+0

@AleksSladeは、要求が行われているコンテキストに依存します。非同期呼び出しを行う方法の規則を適用します。 'var result = HttpClientExtension.PostRequestAsync(" URL here "、" Params Here ")'を待ちます。 – Nkosi

0

にリファクタリングを検討する非同期(async)使用されることを意味しています。

クエリ(ASP.NETのCore 2コントローラー):

async Task<byte[]> CreateImage(IFormFile file) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
    await file.CopyToAsync(memoryStream); 
    var image = new Image(memoryStream); 
    var height = image.Height < 150 ? image.Height : 150; 
    image.Resize((int)(image.Width * height/image.Height), height).Save(memoryStream); 
    return memoryStream.ToArray(); 
    } 
} 

[HttpPost, ValidateAntiForgeryToken] 
public async Task<IActionResult> ImageAdd(ImageAddVm vm) 
{ 
    byte[] image = null; 
    if (vm.File != null && vm.File.Length > 0) 
    image = await CreateImage(vm.File); 
    if (image != null) 
    { 
    var json = JsonConvert.SerializeObject(new { vm.ObjectId, image }); 
    var content = new StringContent(json, Encoding.UTF8, "application/json"); 
    var client= new HttpClient(); 
    await client.PostAsync($"{ApiUrl}/SaveImage", content); 
    } 
    return RedirectToAction("ReturnAction"); 
} 

API(ASP.NETのCore 2コントローラー):非同期バージョンで

public class ObjectImage 
{ 
    public int ObjectId { get; set; } 
    public byte[] Image { get; set; } 
} 

[HttpPost("SaveImage")] 
public void SaveImage([FromBody]object content) 
{ 
    var obj = JsonConvert.DeserializeObject<ObjectImage>(content.ToString()); 
    _db.Images.Find(obj.ObjectId).Image = obj.Image; 
    _db.SaveChanges(); 
} 
関連する問題