我正在使用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%提交邮件。
答案 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软件/路由问题,甚至是短信网关本身。
答案 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;
}
}