确保下载完成

时间:2013-02-16 09:08:25

标签: c# .net webclient

我正在使用for循环,其中 Webclient Downloadstring()方法用于加载外部网址。 网址由短信服务提供商提供,其中添加了手机号码和要传输的信息 但是,对于phNos[]阵列中指定的所有移动电话号码,未向SMS网关提交消息,即某些号码会跳过下载Url。这主要发生在阵列末端的手机号码上 如何确保程序在加载特定数字的URL之前等待,然后程序继续前进。

WebClient cli = new WebClient();
for (i=0;i<phNos.Length;i++)
{
    string url = @"http://example.com?DestNo=" + phNos[i] + "&msg=" + message; 
    cli.DownloadString(url);  
}

或者我也使用了System.Net.HttpWebRequest,但问题仍然存在。

  for (i=0;i<phNos.Length;i++)
    {
        string url = @"http://example.com?DestNo=" + phNos[i] + "&msg=" + message; 
        Uri targetUri = new Uri(url);
        HttpWebRequest hwb = (HttpWebRequest)HttpWebRequest.Create(targetUri);

        System.Net.HttpWebResponse response = hwb1.GetResponse();
        int status = (int)response.StatusCode;

        if (status == 200)
        {

            Response.Write("Successfully transmitted" + status);
        }
    }

是否有其他替代方法可以确保100%提交邮件。

2 个答案:

答案 0 :(得分:1)

我会为每次调用实例化一个webclient,并在调用downloadstring之后将其处理掉,就像这样

foreach(var phone in phNos)
{
  using(WebClient cli= new WebClient())
  {
     url = String.Format(@"http://aaa.bbb.ccc.ddd?DestNo={0}&msg={1}", phone, message); 
     string result = cli.DownloadString(url); 
     // check if result has somekind of errorreport maybe? 
     Trace.WriteLine(result);  // optionally write it to a trace file
  }
}

明确地处理它可能有助于更快地关闭底层网络连接,因为我怀疑连接的数量绝对是导致问题的原因。限制也可能是一种选择(每分钟向网关发送较少的呼叫)

如果这是10000或100000次呼叫,您和短信网关之间的网络组件可能是罪魁祸首。想想adsl调制解调器/ vpn软件/路由问题,甚至是短信网关本身。

如果仍然无法解决问题:请尝试FiddlerWireshark深入检查http流量甚至tcp / ip流量。

答案 1 :(得分:1)

您的代码看起来很好。 DownloadString是阻塞的,如果发生错误,它应该引发异常。 SMS网关如何响应您的请求?你应该看看他们的文档,因为你可能会编写一个函数来测试一切是否正常。

const int MAX_RETRY = 10;
WebClient cli= new WebClient();

for(i=0;i<phNos.Length;i++)
{
    url = @"http://aaa.bbb.ccc.ddd?DestNo=" + phNos[i] + "&msg=" + message;

    int cntRetry = 0;

    while (!TestResult(cli.DownloadString(url)) && cntRetry < MAX_RETRY)
        ++cntRetry;
}

问题可能是您在很短的时间内向网关提交了太多请求。您可以尝试在某处放置一些 Thread.Sleep(1000)调用,看看情况是否有所改善。

WebClient cli= new WebClient();
for(i=0;i<phNos.Length;i++)
{
    Thread.Sleep(1000);
    url = @"http://aaa.bbb.ccc.ddd?DestNo=" + phNos[i] + "&msg=" + message; 
    cli.DownloadString(url);  
}

你也可以结合上面两个例子,使用 MAX_RETRY Thread.Sleep 的较低值。

const int MAX_RETRY = 5;
WebClient cli= new WebClient();

for(i=0;i<phNos.Length;i++)
{
    url = @"http://aaa.bbb.ccc.ddd?DestNo=" + phNos[i] + "&msg=" + message;

    int cntRetry = 0;

    while (!TestResult(cli.DownloadString(url)) && cntRetry < MAX_RETRY) {
        Thread.Sleep(500);
        ++cntRetry;
    }
}