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);
}
}
我希望它缓冲所有内容,直到您完成编写,此时它将能够立即使用内容长度。如果你设置:
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"字节?