gpt4 book ai didi

c# - 在 HttpClient 和 WebClient 之间做出决定

转载 作者:IT王子 更新时间:2023-10-29 03:29:46 27 4
gpt4 key购买 nike

我们的 Web 应用程序在 .Net Framework 4.0 中运行。 UI 通过 ajax 调用来调用 Controller 方法。
我们需要使用供应商提供的 REST 服务。我正在评估在 .Net 4.0 中调用 REST 服务的最佳方式。 REST 服务需要 Basic Authentication Scheme 并且它
可以返回 XML 和 JSON 格式的数据。不需要上传/下载大量数据,将来我也看不到任何东西。我查看了一些用于 REST 消费的开源代码项目,但没有发现任何值(value)来证明项目中的额外依赖是合理的。开始评价WebClientHttpClient .我从 NuGet 下载了 .Net 4.0 的 HttpClient。
我搜索了 WebClient 之间的差异和 HttpClientthis site提到单个 HttpClient 可以处理并发调用,并且可以重用解析的 DNS、cookie 配置和身份验证。我还没有看到我们可能因差异而获得的实际值(value)。
我做了一个快速的性能测试来了解 WebClient (同步调用),HttpClient (同步和异步)执行。结果如下:
使用相同的 HttpClient所有请求的实例(最小 - 最大)

WebClient sync: 8 ms - 167 ms
HttpClient sync: 3 ms - 7228 ms
HttpClient async: 985 - 10405 ms


使用新的 HttpClient对于每个请求(最小 - 最大)

WebClient sync: 4 ms - 297 ms
HttpClient sync: 3 ms - 7953 ms
HttpClient async: 1027 - 10834 ms


代码
public class AHNData
{
public int i;
public string str;
}

public class Program
{
public static HttpClient httpClient = new HttpClient();
private static readonly string _url = "http://localhost:9000/api/values/";

public static void Main(string[] args)
{
#region "Trace"
Trace.Listeners.Clear();

TextWriterTraceListener twtl = new TextWriterTraceListener(
"C:\\Temp\\REST_Test.txt");
twtl.Name = "TextLogger";
twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;

ConsoleTraceListener ctl = new ConsoleTraceListener(false);
ctl.TraceOutputOptions = TraceOptions.DateTime;

Trace.Listeners.Add(twtl);
Trace.Listeners.Add(ctl);
Trace.AutoFlush = true;
#endregion

int batchSize = 1000;

ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = batchSize;

ServicePointManager.DefaultConnectionLimit = 1000000;

Parallel.For(0, batchSize, parallelOptions,
j =>
{
Stopwatch sw1 = Stopwatch.StartNew();
GetDataFromHttpClientAsync<List<AHNData>>(sw1);
});
Parallel.For(0, batchSize, parallelOptions,
j =>
{
Stopwatch sw1 = Stopwatch.StartNew();
GetDataFromHttpClientSync<List<AHNData>>(sw1);
});
Parallel.For(0, batchSize, parallelOptions,
j =>
{
using (WebClient client = new WebClient())
{
Stopwatch sw = Stopwatch.StartNew();
byte[] arr = client.DownloadData(_url);
sw.Stop();

Trace.WriteLine("WebClient Sync " + sw.ElapsedMilliseconds);
}
});

Console.Read();
}

public static T GetDataFromWebClient<T>()
{
using (var webClient = new WebClient())
{
webClient.BaseAddress = _url;
return JsonConvert.DeserializeObject<T>(
webClient.DownloadString(_url));
}
}

public static void GetDataFromHttpClientSync<T>(Stopwatch sw)
{
HttpClient httpClient = new HttpClient();
var response = httpClient.GetAsync(_url).Result;
var obj = JsonConvert.DeserializeObject<T>(
response.Content.ReadAsStringAsync().Result);
sw.Stop();

Trace.WriteLine("HttpClient Sync " + sw.ElapsedMilliseconds);
}

public static void GetDataFromHttpClientAsync<T>(Stopwatch sw)
{
HttpClient httpClient = new HttpClient();
var response = httpClient.GetAsync(_url).ContinueWith(
(a) => {
JsonConvert.DeserializeObject<T>(
a.Result.Content.ReadAsStringAsync().Result);
sw.Stop();
Trace.WriteLine("HttpClient Async " + sw.ElapsedMilliseconds);
}, TaskContinuationOptions.None);
}
}
}
我的问题
  • REST 调用在 3-4 秒内返回,这是可以接受的。调用 REST
    服务在 Controller 方法中启动,从
    Ajax 调用。首先,调用在不同的线程中运行,并且
    不会阻塞 UI。那么,我可以坚持使用同步调用吗?
  • 上面的代码是在我的 localbox 中运行的。在产品设置中,DNS 和代理
    将涉及查找。使用 HttpClient 有什么好处吗?在 WebClient ?
  • HttpClient并发性优于 WebClient ?从测试结果来看WebClient同步调用性能更好。
  • 威尔HttpClient如果我们升级到 .Net 4.5 会是一个更好的设计选择吗?性能是关键的设计因素。
  • 最佳答案

    HttpClient 是较新的 API,它具有以下优点

  • 具有良好的异步编程模型
  • 由 Henrik F Nielson 负责,他基本上是 HTTP 的发明者之一,他设计了 API,因此您可以轻松地遵循 HTTP 标准,例如生成符合标准的 header
  • 在 .Net 框架 4.5 中,因此它对可预见的 future 有一定的支持水平
  • 如果您想在其他平台(.Net 4.0、Windows Phone 等)上使用它,还有该库的 xcopyable/portable-framework 版本。

  • 如果您正在编写一个对其他 Web 服务进行 REST 调用的 Web 服务,您应该希望对所有 REST 调用使用异步编程模型,这样您就不会遇到线程饥饿。您可能还想使用具有 async/await 支持的最新 C# 编译器。

    注意:AFAIK 的性能不是更高。如果您创建一个公平的测试,它的性能可能有些相似。

    关于c# - 在 HttpClient 和 WebClient 之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20530152/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com