我用下面这段话:如下代码,模拟post请求,我的操作过程是先调用一次SendDataByPost获取需要的信息之后,再调用一次SendDataByPost继续下一步操作,结果提示如下异常:请教高手这是啥问题,怎么样解决?
(这里应该是关闭流的原因导致的,具体方法,看下面的别人的回答)
#---------------------------异常
timer1_Tick,系统异常原因:System.Net.WebException: 请求被中止: 请求已被取消。 ---[right]1[/right] System.IO.IOException: 在写入所有字节之前不能关闭流。
在 System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
--- 内部异常堆栈跟踪的结尾 ---
在 System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
在 System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
在 System.Net.ConnectStream.Dispose(Boolean disposing)
在 System.IO.Stream.Close()
在 System.IO.StreamWriter.Dispose(Boolean disposing)
在 System.IO.StreamWriter.Close()
#------------------------代码
#region 同步通过POST方式发送数据
/// [left]1[/left]summary[right]1[/right]
/// 通过POST方式发送数据
/// [left]1[/left]/summary[right]1[/right]
/// [left]1[/left]param name=[qu]1[/qu]Url[qu]1[/qu][right]1[/right]url[left]1[/left]/param[right]1[/right]
/// [left]1[/left]param name=[qu]1[/qu]postDataStr[qu]1[/qu][right]1[/right]Post数据[left]1[/left]/param[right]1[/right]
/// [left]1[/left]param name=[qu]1[/qu]cookie[qu]1[/qu][right]1[/right]Cookie容器[left]1[/left]/param[right]1[/right]
/// [left]1[/left]returns[right]1[/right][left]1[/left]/returns[right]1[/right]
public string SendDataByPost(string Url,string postDataStr,ref CookieContainer cookie)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
if (cookie.Count == 0)
{
request.CookieContainer = new CookieContainer();
cookie = request.CookieContainer;
}
else
{
request.CookieContainer = cookie;
}
request.Method = [qu]1[/qu]POST[qu]1[/qu];
request.ContentType = [qu]1[/qu]application/x-www-form-urlencoded[qu]1[/qu];
request.ContentLength = postDataStr.Length;
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding([qu]1[/qu]gb2312[qu]1[/qu]));
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding([qu]1[/qu]utf-8[qu]1[/qu]));
string retString= myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
#endregion
如果连接关闭的分块的 HTTP 响应完全发送到客户端之前在客户端引发以下异常:
System.Net.WebException: 请求已中止: 连接被意外地关闭在 楼上的,请问该如何修改呢? myStreamWriter.Write(postDataStr);
按提示应该是这句还没写完你就调用了关闭流,可以用这种写法试试
byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes(postDataStr);
myStreamWriter.Write(requestBytes, 0, requestBytes.Length); 删除你的三个.Close语句,完全没有必要。
很快地,GC清理无用对象时会去自动执行Close代码(对象的析构函数中会调用dispose)。
不要以为使用ado.net的dbconnection时应该及时close,于是就套用在这里。完全不是一回事。 如果一定要自己写Close,那么把你的那句 myStreamWriter.Close() 挪到 Stream myResponseStream = response.GetResponseStream() 这一句的后边,这又这时候才能去Close关于Request的流。 string postData = [qu]1[/qu]This is a test that posts this string to a Web server.[qu]1[/qu];
byte[] byteArray = Encoding.UTF8.GetBytes (postData);
// Set the ContentType property of the WebRequest.
request.ContentType = [qu]1[/qu]application/x-www-form-urlencoded[qu]1[/qu];
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream ();
// Write the data to the request stream.
dataStream.Write (byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close ();
[left]1[/left]div[right]1[/right][left]1[/left]fieldset[right]1[/right][left]1[/left]legend[right]1[/right]引用 5 楼 sp1234 的回复:[left]1[/left]/legend[right]1[/right]
如果一定要自己写Close,那么把你的那句 myStreamWriter.Close() 挪到 Stream myResponseStream = response.GetResponseStream() 这一句的后边,这又这时候才能去Close关于Request的流。
[left]1[/left]/fieldset[right]1[/right]