【问题标题】:Why I can't reuse WebClient to make the same request twice?为什么我不能重复使用 WebClient 两次发出相同的请求?
【发布时间】:2016-02-29 15:50:37
【问题描述】:

所以代码:

        const long testCount = 2;
        const string jsonInput = "{\"blockId\":\"1\",\"userId\":\"{7c596b41-0dc3-45df-9b4c-08840f1da780}\",\"sessionId\":\"{46cd1b39-5d0a-440a-9650-ae4297b7e2e9}\"}";

        Stopwatch watch = Stopwatch.StartNew();

        using (var client = new WebClient())
        {
            client.Headers["Content-type"] = "application/json";
            client.Encoding = Encoding.UTF8;

            for (int i = 0; i < testCount; i++)
            {
                var response = client.UploadString("http://localhost:8080/BlocksOptimizationServices/dataPositions", "POST", jsonInput);
            }

            watch.Stop();
            double speed = watch.ElapsedMilliseconds / (double)testCount; 
            Console.WriteLine("Avg speed: {0} request/ms", testCount);

对于性能测试,我只想多次致电client.UploadString("http://localhost:8080/BlocksOptimizationServices/dataPositions", "POST", jsonInput)。但是在第一次请求之后,它总是失败并出现

“远程服务器返回错误:(400) Bad Request。”

如果我处理 WebClient 并重新创建 - 可以,但这会增加额外的性能损失。为什么我不能重复使用 WebClient 两次?

【问题讨论】:

  • 您是否在 Fiddler 运行的情况下运行了两次并比较了请求?后续请求清楚地到达服务器以接收 400 错误。

标签: c# .net wcf webclient


【解决方案1】:

每次请求后都会清除 WebClient 标头。要亲自查看,您可以添加几个 Debug.Assert() 语句。这与您对第二个请求的“(400) Bad request”错误一致:

for (int i = 0; i < testCount; i++)
{
      Debug.Assert(client.Headers.Count == 1); // Content-type is set   
      var response = client.UploadString("http://localhost:8080/BlocksOptimizationServices/dataPositions", "POST", jsonInput);    
      Debug.Assert(client.Headers.Count == 0); // Zero!
}

因此,您可以更改代码以每次设置标题:

using (var client = new WebClient())
{            
    for (int i = 0; i < testCount; i++)
    {
        client.Headers["Content-type"] = "application/json";
        client.Encoding = Encoding.UTF8;

        var response = client.UploadString("http://localhost:8080/BlocksOptimizationServices/dataPositions", "POST", jsonInput);
    }

如果我处理 WebClient 并重新创建 - 可以,但这会增加额外的 性能损失.. 为什么我不能重复使用 WebClient 两次?

这是一个 SO 线程,它似乎并不认为为每个请求实例化一个 WebClient 会大大降低性能:WebClient construction overhead

祝你好运!

【讨论】:

    【解决方案2】:

    这可能不是您想要的,但这就是我解决这个问题的方法。

    public WebClient WebClient
                    => new WebClient {Headers = new WebHeaderCollection {{HttpRequestHeader.ContentType, "application/json"}}};
    

    这会在您每次使用时创建一个新的 WebClient。这样做可能对您来说效率不高,但是对于我使用它的原因,它运行良好,并且无需考虑为每个请求设置标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多