【发布时间】:2014-08-10 02:30:09
【问题描述】:
我有一个关于 WebClient 的问题,希望有人能帮助我。我知道这个问题被问了几次,但我找不到一个好的答案。
我有两种不同的情况需要调用 URL。 a) 我不需要 URL 的任何回复(Fire&Forget)。 b) URL 返回一个 JSON,所以我需要等待在服务器上完成处理才能获取我的数据。
我对 a) 有一些问题,我不知道我所做的是否有意义。为了实现 Fire&Forget,我将 WebClient 超时设置为一个“小”数字,500 毫秒(代码如下)。 我的问题是:
a) 这是一个好方法还是没有任何意义? b) 等待 500 毫秒是否有意义?我可以将超时设置为零吗? c) 这种方法安全吗?我不在乎处理完成需要多长时间,但我想确保我能够启动 Web 服务。下面的代码是否保证 Web 服务会被触发,如果没有,我会得到一个不是 Timneout 的异常?
非常感谢!
public static void SubmitUrl(string url)
{
using (WebClient webClient = new WebClientEx(500))
{
try
{
Logger.Log(string.Format("Start Invoking URL: {0}", url));
var response = webClient.OpenRead(url);
response.Close();
Logger.Log(string.Format("End Invoking URL: {0}", url));
}
catch (System.Net.WebException ex)
{
if (ex.Status != WebExceptionStatus.Timeout)
{
Logger.Log(string.Format("Exception Invoking URL: {0} \n {1}", url, ex.ToString()));
throw;
}
}
catch (System.Exception ex)
{
Logger.Log(string.Format("Exception Invoking URL: {0} \n {1}", url, ex.ToString()));
throw;
}
}
}
public class WebClientEx : WebClient
{
// Timeout in milliseconds
public int timeout { get; set; }
public WebClientEx(int timeout)
: base()
{
this.timeout = timeout;
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest wr = base.GetWebRequest(address);
wr.Timeout = this.timeout;
return wr;
}
}
}
【问题讨论】:
-
您使用的是哪个 .NET 框架版本?
标签: c# webclient fire-and-forget