HttpWebRequest即使没有互联网连接也能获得流

本文关键字:连接 互联网 HttpWebRequest | 更新日期: 2023-09-27 17:49:49

我使用下面的代码发送一个字节数组到一个站点。为什么这段代码没有抛出异常,即使没有互联网连接?即使在没有连接的情况下,我也能够获得流并能够对其进行写入。我预计它会在Stream postStream = request1.EndGetRequestStream(result)抛出一个异常。有人知道为什么它会这样做吗?

     private void UploadHttpFile()
    {
        HttpWebRequest request = WebRequest.CreateHttp(new Uri(myUrl));
        request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);

        request.UserAgent = "Mozilla/4.0 (Windows; U; Windows Vista;)";
        request.Method = "POST";
        request.UseDefaultCredentials = true;
        request.BeginGetRequestStream(GetStream, request);

    }
    private void GetStream(IAsyncResult result)
    {
        try
        {
            HttpWebRequest request1 = (HttpWebRequest)result.AsyncState;
            using (Stream postStream = request1.EndGetRequestStream(result))
            {
                int len = postBody.Length;
                len += mainBody.Length;
                len += endBody.Length;
                byte[] postArray = new byte[len + 1];
                Encoding.UTF8.GetBytes(postBody.ToString()).CopyTo(postArray, 0);
                Encoding.UTF8.GetBytes(mainBody).CopyTo(postArray, postBody.Length);
                Encoding.UTF8.GetBytes(endBody).CopyTo(postArray, postBody.Length + mainBody.Length);
                postStream.Write(postArray, 0, postArray.Length);
            }
        }

HttpWebRequest即使没有互联网连接也能获得流

我希望它缓冲所有内容,直到您完成编写,此时它将能够立即使用内容长度。如果你设置:

request.AllowWriteStreamBuffering = false;

,那么我怀疑它至少会在写流时失败。

Btw,你对postArray所需长度的计算似乎是假设每个字符一个字节,这并不总是如此…在postBody上调用ToString 看起来是多余的。我不知道你为什么要在一个电话里写……或者你可以调用Write三次:

byte[] postBodyBytes = Encoding.UTF8.GetBytes(postBody);
postStream.Write(postBodyBytes, 0, postBodyBytes.Length);
// etc

(最好)只使用StreamWriter:

using (Stream postStream = request1.EndGetRequestStream(result))
{
    using (StreamWriter writer = new StreamWriter(postStream)
    {
        writer.Write(postBody);
        writer.Write(mainBody);
        writer.Write(endBody);
    }
}

不清楚为什么在初始化postArray时将1添加到所需的长度。您是否尝试在数据末尾发送额外的"0"字节?