执行一个循环内的web请求只能在第一遍只能在、web

2023-09-05 04:18:58 作者:落阳、一地的殇

我是把一个字符串消息,并分解成块,这样我可以将它发送到短信服务(即啥都不打破它给你)。我后,我做我的工作,为突破这些消息的时候,我试图通过产生的数组并执行一个Web请求。的问题是,它仅适用于所述第一消息,并在那之后挂起。经过很短的时间,我得到一个错误信息连接被意外关闭。这发生在它尝试的GetResponse()的第二次;我已经看到了这里的几个其他职位,被简单地说,关闭和处置的响应和请求流。这不是为我工作的全部。这是我的code是当前:

 私有静态无效的主要(字串[] args)
{
    变种oldMessage = GetFileString();
    Console.WriteLine(的String.Format(旧消息:{0},oldMessage.Length));

    VAR NewMessage作为= UrlPathEn codeString的(oldMessage);
    Console.WriteLine(的String.Format(新消息:{0},newMessage.Length));

    VAR brokenUp = SplitByLength(NewMessage作为,145).ToArray();
    对于(VAR I = 0; I< brokenUp.Count();我++)
    {
        brokenUp [i] = brokenUp [I] .Insert(0,UrlPathEn codeString的(的String.Format(({0:D2} {1:D2}),我+ 1,brokenUp.Count()) ));
        Console.WriteLine(的String.Format(追加长度:{0},brokenUp [I] .Length));
    }

    System.Net.ServicePointManager.DefaultConnectionLimit = 100;
    的foreach(在brokenUp VAR块)
    {
        Thread.sleep代码(1500);
        SendSms((HttpWebRequest的)WebRequest.Create(http://172.20.5.214:90/method/sendsms),块);
    }
    Console.ReadKey();
}

公共静态无效SendSms(HttpWebRequest的要求,字符串消息)
{
    //构造请求
    VAR URL =HTTP:// IP地址/方法/ sendsms;
    // VAR请求=(HttpWebRequest的)WebRequest.Create(URL);
    request.Method =POST;
    request.ContentType =应用/的X WWW的形式urlen codeD;

    VAR栏=CellNumber = {0}&放大器;消息= {1};
    域=的String.Format(领域,16021234567,邮件);

    VAR fieldsBytes = Encoding.UTF8.GetBytes(场);
    request.ContentLength = fieldsBytes.Length;
    VAR长度= fieldsBytes.Length;

    使用(VAR requestStream = request.GetRequestStream())
    {
        requestStream.Write(fieldsBytes,0,长度);

        使用(VAR响应= request.GetResponse())
        {
            使用(VAR responseStream = response.GetResponseStream())
            {
                responseStream.Close();
            }
        }
        requestStream.Close();
    }
}

公共静态的byte []的readFully(流流)
{
    VAR缓冲区=新的字节[32768]
    使用(VAR毫秒=新的MemoryStream())
    {
        而(真)
        {
            INT读= stream.Read(缓冲,0,buffer.Length);
            如果(读< = 0)
                返回ms.ToArray();
            ms.Write(缓冲,0,读);
        }
    }
}
 

解决方案

我碰到的情况下, response.Close 显示,如果你不下载整个挂响应的内容。这是为什么,我不知道,但是当呼叫 request.Abort 调用关闭()解决了之前问题。我不指望你会看到这个问题,不过,除非响应可能是许多兆字节大小。

此外,不能调用之前关闭请求流的GetResponse 可能prevent所有被发送的数据。我建议叫 requestStream.Close 发出请求之前。但同样,这似乎很奇怪,你的code将工作第一次但不是在后续的请求。

您修改code,考虑到改变我建议,应该是:

 使用(VAR requestStream = request.GetRequestStream())
{
    requestStream.Write(fieldsBytes,0,长度);
}

使用(VAR响应= request.GetResponse())
{
    使用(VAR responseStream = response.GetResponseStream())
    {
        //这里读取响应。
        request.Abort();
        responseStream.Close();
    }
}
 
如何用网络调试助手模拟打开网页的请求

I am taking a string message and breaking it up into chunks so that I can send it to an sms service (that consequently doesn't break it up for you). I after I do my work for break those messages up, I try loop through the resulting array and execute a web request. The problem is that it only works for the first message, and then hangs after that. After a short time, I get an error message saying "The connection was closed unexpectedly." This occurs at the second time it attempts GetResponse(); I've seen a few other posts on here that were simply saying to close and dispose the response and request streams. This isn't working for me at all. This is where my code is currently:

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

解决方案

I've run into cases where response.Close appears to hang if you fail to download the entire contents of the response. Why this is, I don't know, but placing a call to request.Abort before calling Close() solves the problem. I wouldn't expect you to be seeing this problem, though, unless the response could potentially be many megabytes in size.

Also, failing to close the request stream before calling GetResponse might prevent all of the data from being sent. I would suggest calling requestStream.Close before making the request. But again, it seems odd that your code would work the first time but not on subsequent requests.

Your modified code, taking into account the changes I suggested, would be:

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();
    }
}