0

Webclientクラスメソッドを使用して外部 URL をロードするforループを使用しています。URL は SMS サービス プロバイダーから提供されており、携帯電話番号と送信するメッセージが追加されています。 ただし、配列で指定されたすべての携帯電話番号についてメッセージが SMS ゲートウェイに送信されていません。つまり、いくつかの番号について URL のダウンロードがスキップされています。これは主に、配列の末尾にある携帯電話番号で発生します。 特定の番号のURLがロードされるまでプログラムが待機し、プログラムが前進するようにするにはどうすればよいですか。Downloadstring()
phNos[]

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% 送信されるようにする他の方法はありますか。

4

2 に答える 2

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
  }
}

明示的に破棄すると、基になるネットワーク接続をより迅速に閉じるのに役立つ場合があります。これは、膨大な数の接続が問題の原因であると思われるためです。スロットリングもオプションの可能性があります (1 分あたりのゲートウェイへの呼び出しを減らす)

これが 10000 または 100000 コールの場合は、SMS ゲートウェイとの間のネットワーク コンポーネントが原因である可能性があります。adsl モデム/vpn ソフトウェア/ルーティングの問題、さらには sms-gateway 自体についても考えてみてください。

それでも問題が解決しない場合: FiddlerまたはWiresharkを試して、http トラフィックまたは tcp/ip トラフィックを詳細に検査します。

于 2013-02-16T09:18:09.713 に答える
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_RETRYThread.Sleep により低い値を使用して、上記の 2 つの例を組み合わせることもできます。

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;
    }
}
于 2013-02-16T09:26:31.167 に答える