4

大量のユーザー(4000ユーザー)に送信したいSMSので、次のメソッドをループに入れます:

protected int SendSMS(string url)
        {
            // Now to Send Data.

            StreamWriter writer = null;
            StringBuilder postData = new StringBuilder();
            Uri myUri = new Uri(url);
            postData.Append(HttpUtility.ParseQueryString(myUri.Query).Get("Username"));
            postData.Append(HttpUtility.ParseQueryString(myUri.Query).Get("Password"));
            postData.Append(HttpUtility.ParseQueryString(myUri.Query).Get("Sender"));
            postData.Append(HttpUtility.ParseQueryString(myUri.Query).Get("Recipients"));
            postData.Append(HttpUtility.ParseQueryString(myUri.Query).Get("MessageData"));



            string webpageContent = string.Empty;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData.ToString());
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.Method = "POST";
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.ContentLength = webRequest.ContentLength = byteArray.Length;

            writer = new StreamWriter(webRequest.GetRequestStream());


            try
            {
                using (Stream webpageStream = webRequest.GetRequestStream())
                {
                    webpageStream.Write(byteArray, 0, byteArray.Length);
                }

                using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(webResponse.GetResponseStream()))
                    {
                        webpageContent = reader.ReadToEnd();
                        //TODO:parse webpagecontent: iF response contains "OK"
                        if (webpageContent.Contains("OK")) return 1;
                        else return 0;
                    }
                }
                //return 1;

            }
            catch (Exception ee)
            {
                ErrMapping.WriteLog(url);
                string error = ee.Message + "<br><br>Stack Trace : " + ee.StackTrace;
                ErrMapping.WriteLog(error);
                return -1;
            }

        }

65 ユーザーなどの特定の数のユーザーの後sms、残りのユーザーには送信されず、

次の例外が発生します。

Error Message:Thread was being aborted.<br><br>Stack Trace :    at System.Net.UnsafeNclNativeMethods.OSSOCK.recv(IntPtr socketHandle, Byte* pinnedBuffer, Int32 len, SocketFlags socketFlags)
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, SocketError& errorCode)
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
   at System.Net.ConnectStream.ProcessWriteCallDone(ConnectionReturnResult returnResult)
   at System.Net.HttpWebRequest.CheckDeferredCallDone(ConnectStream stream)
   at System.Net.HttpWebRequest.GetResponse()
   at SendSMS_EmailUI.Frm_SMS_send.SendSMS(String url) 
4

8 に答える 8

6

SMSポータルを構築しました。あなたが説明したことは、私のアプリケーションの v1.0 でも経験されました。解決策は、SMS ゲートウェイで HTTP 経由のバルク SMS アクセスを提供することでした。最大 1000 の宛先を XML (またはカンマ区切り) パッケージに入れ、Bulk SMS Gateway に送信できました。私は共有ホストで実行しているため、これを 500 の宛先に制限しました。

場合によっては大きな送信先 (最大 1,000,000) をバッチ処理するキャッシュ/一時ストレージ/テーブルがあり、スケジューラ (タイマー ベース) はメッセージが送信されるまで (スクリプトを繰り返し呼び出すことによって) 数秒ごとに 500 の各バッチを送信します。魅力のように動作します!

パーソナライズされたメッセージについては、SMS ポータルに転送する前にデスクトップ アプリケーションを使用してパーソナライズすることをクライアントに勧めています。幸運を

処理する:

3つのアイテムが必要です

  1. SendSMS リクエストを受信するスクリプト
  2. SMS を送信するスクリプト
  3. スケジューラ/タイマー (スクリプト/ホスト サービス)

A. Send SMS リクエストは

a. The Message and Sender ID/ Sender GSM Number.

b. The Destinations (as a comma delimited list). We'll assume 10,000 destinations

B. 送信先を 500 (任意のサイズ) に分割し、500 の送信先をメッセージと SenderID と共に各 INBOX 行/レコードに記録します。 注: ループ (10,000 ループ) で 500 をカウントすると、スクリプトがタイムアウトになる可能性があります。私の国の GSM 番号は 13 桁です。そこで、長さ 500 (13+1) のループ サブストリングを実行して、バッチごとに 500 の宛先を取得します (20 ループ)。*

C. SMS を送信するスクリプトを呼び出します。最初の 500 件を送信し、メッセージに送信済みのタグを付けます。送信時間を追加できます。スケジューラを開始する

D. スケジューラは、INBOX に未送信のメッセージが存在するかどうかを 1.5 分ごとに確認して送信します。何もない場合、スケジューラは停止します。したがって、10,000 件のメッセージが 30 分以内に送信されます

于 2013-05-18T04:39:41.503 に答える
5

これは元の質問への回答ではありませんが、関連する有用な情報です。この問題を解決すると、別の問題が発生する可能性があります。通信事業者は、SMS スパムを抑止する方法として、一括送信された SMS メッセージを日常的にブロックしています。これを商業規模で行う場合は、モバイル マーケティング アソシエーションに概要を提出し、承認を得る必要があります。これにはかなりの時間がかかる可能性があります。

于 2013-05-18T01:15:57.687 に答える
3

バッファ値がいっぱいになっている可能性があります。確認して、web-config ファイルで最大値に設定してください。

于 2013-05-17T04:27:38.447 に答える