C# 模拟post遇到System.Net.WebException: 请求被中止: 请求已被取消

我用下面这段话:如下代码,模拟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

追无极 发表于 2010-12-6 09:11

如果连接关闭的分块的 HTTP 响应完全发送到客户端之前在客户端引发以下异常:
System.Net.WebException: 请求已中止: 连接被意外地关闭在

uifan 发表于 2010-12-6 09:11

楼上的,请问该如何修改呢?

影对月 发表于 2010-12-6 09:11

myStreamWriter.Write(postDataStr);
按提示应该是这句还没写完你就调用了关闭流,可以用这种写法试试
  byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes(postDataStr);
   myStreamWriter.Write(requestBytes, 0, requestBytes.Length);

anytel 发表于 2010-12-6 09:11

删除你的三个.Close语句,完全没有必要。

很快地,GC清理无用对象时会去自动执行Close代码(对象的析构函数中会调用dispose)。


不要以为使用ado.net的dbconnection时应该及时close,于是就套用在这里。完全不是一回事。

ccbot交易所 发表于 2010-12-6 09:11

如果一定要自己写Close,那么把你的那句 myStreamWriter.Close() 挪到 Stream myResponseStream = response.GetResponseStream() 这一句的后边,这又这时候才能去Close关于Request的流。

anytel 发表于 2010-12-6 09:11

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

su7en 发表于 2010-12-6 09:11

[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]
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值