在方法中使用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);
}
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));
}