2

私は文字列メッセージを取得し、それをチャンクに分割して、SMSサービスに送信できるようにします(その結果、メッセージは分割されません)。これらのメッセージを分割する作業を行った後、結果の配列をループしてWebリクエストを実行します。問題は、最初のメッセージに対してのみ機能し、その後ハングすることです。しばらくすると、「接続が予期せず閉じられました」というエラーメッセージが表示されます。これは、GetResponse()を2回試行したときに発生します。ここで、応答ストリームと要求ストリームを閉じて破棄するように指示している他の投稿をいくつか見ました。これは私にはまったく機能していません。これは私のコードが現在あるところです:

private static void Main(string[] args)
{
    var oldMessage = GetFileString();
    Console.WriteLine(string.Format("Old message: {0}", oldMessage.Length));

    var newMessage = UrlPathEncodeString(oldMessage);
    Console.WriteLine(string.Format("New message: {0}", newMessage.Length));

    var brokenUp = SplitByLength(newMessage, 145).ToArray();
    for(var i = 0; i < brokenUp.Count(); i++)
    {
        brokenUp[i] = brokenUp[i].Insert(0, UrlPathEncodeString(string.Format("({0:D2} of {1:D2})", i + 1, brokenUp.Count())));
        Console.WriteLine(string.Format("Appended length: {0}", brokenUp[i].Length));
    }

    System.Net.ServicePointManager.DefaultConnectionLimit = 100;
    foreach (var block in brokenUp)
    {
        Thread.Sleep(1500);
        SendSms((HttpWebRequest)WebRequest.Create("http://172.20.5.214:90/method/sendsms"), block);
    }
    Console.ReadKey();
}

public static void SendSms(HttpWebRequest request, string message)
{
    //build the request
    var url = "http://ipaddress/method/sendsms";
    //var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";

    var fields = "CellNumber={0}&Message={1}";
    fields = string.Format(fields, "16021234567", message);

    var fieldsBytes = Encoding.UTF8.GetBytes(fields);
    request.ContentLength = fieldsBytes.Length;
    var length = fieldsBytes.Length;

    using (var requestStream = request.GetRequestStream())
    {
        requestStream.Write(fieldsBytes, 0, length);

        using (var response = request.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                responseStream.Close();
            }
        }
        requestStream.Close();
    }
}

public static byte[] ReadFully(Stream stream)
{
    var buffer = new byte[32768];
    using (var ms = new MemoryStream())
    {
        while (true)
        {
            int read = stream.Read(buffer, 0, buffer.Length);
            if (read <= 0)
                return ms.ToArray();
            ms.Write(buffer, 0, read);
        }
    }
}
4

1 に答える 1

4

response.Close応答の内容全体をダウンロードしなかった場合にハングするように見える場合があります。理由はわかりませんが、電話をかけるrequest.Abort前に電話をかけるとClose()問題は解決します。ただし、応答のサイズが数メガバイトになる可能性がない限り、この問題が発生することはないと思います。

また、呼び出す前にリクエストストリームを閉じGetResponseないと、すべてのデータが送信されない可能性があります。requestStream.Closeリクエストする前に電話することをお勧めします。しかし、繰り返しになりますが、コードが最初は機能するが、その後のリクエストでは機能しないのは奇妙に思えます。

私が提案した変更を考慮に入れて、変更したコードは次のようになります。

using (var requestStream = request.GetRequestStream())
{
    requestStream.Write(fieldsBytes, 0, length);
}

using (var response = request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        // read the response here.
        request.Abort();
        responseStream.Close();
    }
}
于 2012-11-07T01:31:45.527 に答える