在方法中使用Web客户端

本文关键字:Web 客户端 方法 | 更新日期: 2023-09-27 18:26:08

我正在研究如何创建一个可以在代码中重用的web客户端方法。现在,下面的代码将调用client_DownloadStringCompleted,我必须在那里处理返回的数据,但我想在request方法中这样做,这样我就可以返回它

private string request(string json, string url) {
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new Uri(url);
}

在方法中使用Web客户端

WebClient调用是异步的,这是有原因的。原因通常是在调用启动并通过连线返回结果的等待时间内不阻塞UI线程。

我认为你在设计上犯了一个错误,强制执行了一个老派的阻止呼叫。

有关解决方案,请参阅我对此问题的回答。WebClient-等待文件下载

由于web请求是异步执行的,因此没有一种简单的方法可以阻止该方法,并且只在收到响应时(如果?)返回。(有一种方法可以做到这一点,但出于性能、可用性和可维护性的原因,建议不要这样做。)

相反,您应该编写设计为异步运行的代码。

您的情况的一般模式是指定一个回调方法,该方法将一个操作作为最终参数
实现该操作的最简单方法是使用一个参数,即webresponse对象。为了帮助代码重用和关注点分离,您可能希望将操作转移到Exception或原始(或可能格式化)响应内容的元组中。

你会想把你的方法写成这样:

private string request(string json,
                       string url,
                       Action<Exception, string> callback)
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += (s, e) => 
        {
            // add better error handling than this!!!
            try
            {
                callback(e.Error, e.Result);
            }
            catch (Exception exc)
            {
                callback(exc, null);
            }
        };
    client.DownloadStringAsync(new Uri(url);    
}

或者,您可以使用异步ctphttp://msdn.microsoft.com/en-us/vstudio/gg316360

这个同步方法可以使用,但它会阻塞你的线程,直到下载完成,因此不是首选方法,但我认为它会回答你的问题:

private string Request(string url) 
{
    WebClient client = new WebClient();
    return client.DownloadString(new Uri(url));
}