如何重新发出网络请求?我必须重新创建 Webclient 吗?

Posted

技术标签:

【中文标题】如何重新发出网络请求?我必须重新创建 Webclient 吗?【英文标题】:How do I reissue a webrequest? Must I recreate Webclient? 【发布时间】:2013-11-08 16:27:15 【问题描述】:

当遇到异常时,以下代码会卡在 while 循环中。这是因为 GetResponse 正在缓存数据。

按照fiddler的说法,第一次请求发出后就没有数据了。

重新创建 Web 客户端以解决我遇到的“刷新”问题是最佳做法吗?

    private static ReportStatusEnum GetReportStatus(string domain, string oAuthKey, long permissionReportID)
    
        string target = string.Format("https://0.egnyte.com/pubapi/v1/audit/jobs/1", domain, permissionReportID);

        var client = new WebClient();

         string result ="";
        var request = (HttpWebRequest)WebRequest.Create(target);
        request.ContentType = "application/json";
        request.Headers.Add("Authorization", "Bearer " + oAuthKey);
        request.AllowAutoRedirect = false;

        bool callComplete = false;
        while (callComplete != true)
        
            try
            
                using (var response = request.GetResponse())
                
                    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                    
                        result = reader.ReadToEnd();
                    
                

                JToken result2 = JObject.Parse(result);
                var statusResult = result2.SelectToken("status");

                ReportStatusEnum ret = ReportStatusEnum.error;

                Enum.TryParse<ReportStatusEnum>(statusResult.ToString(), out ret);

                Console.WriteLine("The returned variable is:" + ret);

                callComplete = true;
                return ret;
            
            catch (System.Net.WebException e)
            
                if (e.Response != null)
                    if (e.Response.ContentLength > 0)
                    
                        if (e.Response.Headers["X-Mashery-Error-Code"] == "ERR_403_DEVELOPER_OVER_QPS")
                        
                            Thread.Sleep(60000); Console.Write("*QPS HIT*");
                        
                    
            
        
        return ReportStatusEnum.error;
    

【问题讨论】:

你为什么还要有一个WebClient?你没有用它做任何事情。如果您使用的是WebRequest.Create,则不需要无所事事的 WebClient。 删除未使用的client变量,并将WebRequest.Create(target)移动到循环中。 【参考方案1】:

没有。 HttpWebRequests 不可重用。

只需将 WebRequest 的创建移动到循环主体中:

    string result ="";

    bool callComplete = false;
    while (callComplete != true)
    
        var request = (HttpWebRequest)WebRequest.Create(target);
        request.ContentType = "application/json";
        request.Headers.Add("Authorization", "Bearer " + oAuthKey);
        request.AllowAutoRedirect = false;
                    //...

【讨论】:

以上是关于如何重新发出网络请求?我必须重新创建 Webclient 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何中止Ember Data发出的HTTP请求?

发出许多网络请求的 iOS 应用程序的最佳架构?

如何从列表视图中删除某些内容并重新加载页面?颤振网络

HTTPS Tomcat重新路由请求

浏览器在请求失败时自行发出请求,当互联网重新连接时

如何在 UITableVIewCell 中进行 API 调用