2016-12-05 13 views
0

HttpClientとHttpWebRequestで同じPOSTリクエストを行うときに何らかの理由でHTTPClientが2000 + ms、HttpWebRequestが約1000-1400 msかかる場合があります。 この不一致は正常ですか?また、httpclientをhttpwebrequestの速度と一致させるためにできることはありますか?C#HttpWebRequestと比較してHttpClientの応答時間が遅い

私は何かを台無しにしている場合のために、以下のコードを投稿しました。

protected WebRequest CreateWebRequest(Uri uri) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(EndPoint)); 
    request.Method = "POST"; 
    request.ContentType = "application/json-rpc"; 
    request.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8"); 
    request.Headers.Add(CustomHeaders); 
    request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
    request.ServicePoint.Expect100Continue = false; 
    ServicePointManager.Expect100Continue = false; 
    return request; 
} 

private async Task<string> DoHttpClientPost(string method, IDictionary<string, object> args = null) 
{ 
    { 
     HttpClientHandler handler = new HttpClientHandler() 
     { 
      AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
     }; 
     handler.Proxy = null; 
     HttpResponseMessage response; 
     using (var myHttpClient = new HttpClient(handler)) 
     { 
      myHttpClient.DefaultRequestHeaders.ExpectContinue = false; 
      myHttpClient.DefaultRequestHeaders.Add("Accept-Charset", "ISO-8859-1,utf-8"); 
      myHttpClient.DefaultRequestHeaders.Add(APPKEY_HEADER, CustomHeaders.GetValues(APPKEY_HEADER)); 
      myHttpClient.DefaultRequestHeaders.Add(SESSION_TOKEN_HEADER, CustomHeaders.GetValues(SESSION_TOKEN_HEADER)); 
      myHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json-rpc")); 
      var call = new JsonRequest { Method = method, Id = 1, Params = args }; 
      var jsonObject = JsonConvert.Serialize<JsonRequest>(call); 
      var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json-rpc"); 
      response = await myHttpClient.PostAsync(new Uri(EndPoint), content); 
     } 
     Console.WriteLine("\nCalling: " + method + " With args: " + JsonConvert.Serialize<IDictionary<string, object>>(args)); 
     string jsonResponse = await response.Content.ReadAsStringAsync(); 

     return jsonResponse; 
    } 
} 


public async Task<T> Invoke2<T>(string method, IDictionary<string, object> args = null) 
{ 
    if (method == null) 
     throw new ArgumentNullException("method"); 
    if (method.Length == 0) 
     throw new ArgumentException(null, "method"); 
    string jsonString = await DoHttpClientPost(method, args); 
    var jsonResult = JsonConvert.Deserialize<JsonResponse<T>>(jsonString); 

    return jsonResult.Result; 
} 



public async Task<T> Invoke<T>(string method, IDictionary<string, object> args = null) 
{ 
    if (method == null) 
     throw new ArgumentNullException("method"); 
    if (method.Length == 0) 
     throw new ArgumentException(null, "method"); 

    var request = CreateWebRequest(new Uri(EndPoint)); 

    using (Stream stream = request.GetRequestStream()) 
    using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8)) 
    { 
     var call = new JsonRequest { Method = method, Id = 1, Params = args }; 
     JsonConvert.Export(call, writer); 
    } 
    Console.WriteLine("\nCalling: " + method + " With args: " + JsonConvert.Serialize<IDictionary<string, object>>(args)); 

    using (WebResponse response = GetWebResponse(request)) 
    using (Stream stream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) 
    { 
     var jsonResponse = JsonConvert.Import<T>(reader); 
     // Console.WriteLine("\nGot Response: " + JsonConvert.Serialize<JsonResponse<T>>(jsonResponse)); 
     if (jsonResponse.HasError) 
     { 
      throw ReconstituteException(jsonResponse.Error); 
     } 
     else 
     { 
      return jsonResponse.Result; 
     } 
    } 
} 
+0

WiresharkやFiddlerのようなものでネットワーク上で何が起こっているのか見てきましたか? –

+0

ええ、彼らは同じヘッダーを持っていて、同じサイズです、その非常に混乱します。 – itsdrea

答えて

0

可能な場合のHttpClientは、reused across requestsでなければなりません。 HttpClientインスタンスの作成を分離し、実際のリクエストを実行しようとしましたか? 1000msは多くのように聞こえるが、インスタンスが保持するリソースの作成と廃棄には時間がかかります。

関連する問題