HttpWebRequest使用注意(发生阻塞的解决办法)







HttpWebRequest myRequest  =   null ;
            HttpWebResponse myResponse 
=   null ;
            Stream reqStream 
=   null
            Stream resStream 
=   null ;

            
try
            
{
                
byte[] data = System.Text.Encoding.Default.GetBytes(param);

                myRequest = (HttpWebRequest)WebRequest.Create(url);
                myRequest.Method 
= "POST";
                myRequest.KeepAlive 
= true;
                myRequest.ContentType 
= "application/octet-stream";
                myRequest.ContentLength 
= data.Length;
                reqStream 
= myRequest.GetRequestStream();
                reqStream.Write(data, 
0, data.Length);
                reqStream.Close();

                myResponse 
= (HttpWebResponse)myRequest.GetResponse();
                resStream 
= myResponse.GetResponseStream();
                data 
= new byte[512];
                
int count = 0;
                UIFactory.zZRK_MODIForm.memStream 
= new MemoryStream();
                
while ((count = resStream.Read(data, 0, data.Length)) > 0)
                
{
                    UIFactory.zZRK_MODIForm.memStream.Write(data, 
0, count);
                }

                resStream.Close();
                
            }

            
catch
            
{
            }

            
finally
            
{
                
if (resStream != null)
                
{
                    resStream.Close();
                }

                
if (reqStream != null)
                
{
                    reqStream.Close();
                }

                
if (myResponse != null)
                
{
                    myResponse.Close();
                }

            }
大家看下这段程序,有问题吗?乍一看,好像没有什么问题,所有的流都释放了,Response也释放了。。不过如果你写个循环无限次发起请求,你会发现,运行不了几次就阻塞了。为什么呢?大家看下面的代码
HttpWebRequest myRequest  =   null ;
            HttpWebResponse myResponse 
=   null ;
            Stream reqStream 
=   null
            Stream resStream 
=   null ;

            
try
            
{
                
byte[] data = System.Text.Encoding.Default.GetBytes(param);

                
//想服务器端发送请求,获取照片信息
                myRequest = (HttpWebRequest)WebRequest.Create(url);
                myRequest.Method 
= "POST";
                myRequest.KeepAlive 
= true;
                myRequest.ContentType 
= "application/octet-stream";
                myRequest.ContentLength 
= data.Length;
                reqStream 
= myRequest.GetRequestStream();
                reqStream.Write(data, 
0, data.Length);
                reqStream.Close();

                myResponse 
= (HttpWebResponse)myRequest.GetResponse();
                resStream 
= myResponse.GetResponseStream();
                data 
= new byte[512];
                
int count = 0;
                UIFactory.zZRK_MODIForm.memStream 
= new MemoryStream();
                
while ((count = resStream.Read(data, 0, data.Length)) > 0)
                
{
                    UIFactory.zZRK_MODIForm.memStream.Write(data, 
0, count);
                }

                resStream.Close();
                
            }

            
catch
            
{
            }

            
finally
            
{
                
if (resStream != null)
                
{
                    resStream.Close();
                }

                
if (reqStream != null)
                
{
                    reqStream.Close();
                }

                
if (myResponse != null)
                
{
                    myResponse.Close();
                }

                
if (myRequest != null)
                
{
                    myRequest.Abort();
                }

            }
多了些什么?多了这个
                 if  (myRequest  !=   null )
                
{
                    myRequest.Abort();
                }
其实很多时候释放了Stream和Response还不够,客户端的Request还是在保持着,需要等垃圾回收器来回收,所以一般很容易阻塞,导致请求发送不出去。加上这个就是让HttpWebRequest实例在不需要的时候及时释放资源。这样可以重复使用而不会阻塞。 

---------------------------------------------------------
专注移动开发

Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 C# WinForm 应用程序中,可以使用 HttpWebRequest 类来实现文件上传,具体步骤如下: 1. 创建 HttpWebRequest 对象,并设置请求参数。 ```csharp HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uploadUrl); request.Method = "POST"; request.ContentType = "multipart/form-data"; ``` 2. 构造要上传的文件数据。 ```csharp byte[] fileData = File.ReadAllBytes(filePath); string fileName = Path.GetFileName(filePath); string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; string formdata = string.Format(formdataTemplate, "file", fileName); byte[] formdataBytes = Encoding.UTF8.GetBytes(formdata); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); ``` 3. 将文件数据写入请求流中。 ```csharp Stream requestStream = request.GetRequestStream(); requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); requestStream.Write(formdataBytes, 0, formdataBytes.Length); requestStream.Write(fileData, 0, fileData.Length); byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); requestStream.Write(trailer, 0, trailer.Length); requestStream.Close(); ``` 4. 发送请求并获取响应。 ```csharp HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); string responseString = reader.ReadToEnd(); reader.Close(); response.Close(); ``` 完整的代码示例如下: ```csharp public void UploadFile(string uploadUrl, string filePath) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uploadUrl); request.Method = "POST"; request.ContentType = "multipart/form-data"; byte[] fileData = File.ReadAllBytes(filePath); string fileName = Path.GetFileName(filePath); string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; string formdata = string.Format(formdataTemplate, "file", fileName); byte[] formdataBytes = Encoding.UTF8.GetBytes(formdata); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); Stream requestStream = request.GetRequestStream(); requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); requestStream.Write(formdataBytes, 0, formdataBytes.Length); requestStream.Write(fileData, 0, fileData.Length); byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); requestStream.Write(trailer, 0, trailer.Length); requestStream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); string responseString = reader.ReadToEnd(); reader.Close(); response.Close(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值