C# 写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!

类别:.NET开发 点击:0 评论:0 推荐:

//调用示例:
/*
2003-7-1
1.支持Proxy
2.可指定同步或异步
3.一些小修改
*/

private void button1_Click(object sender, System.EventArgs e)
 {
  HttpRequestResponse xx = new HttpRequestResponse();
  xx.DataArrival += new DataArrivalEventHandler(xx_DataArrival);
  //xx.SendRequest(@"http://localhost:2080/examples/myservlets/servlet2","message=QQ&desttel=13910911925&mytel=13910081138&mypwd=263996211");
  xx.SendRequest(@"http://localhost","message=你好QQ&desttel=13910911925&mytel=13910081138&mypwd=263996211","GET",true);
  xx.SendRequest("http://localhost/quickstart/util/srcview.aspx?path=/quickstart/howto/samples/net/WebRequests/clientGETasync.src","post",false);
 }
private int i=0;
private void xx_DataArrival(object sender, DataArrivalEventArgs e)
 {
  Console.WriteLine( i++);
  Console.Write(e.RecievedData  );
  if (e.IsComplete)
   {
   Console.Write("[" + ((HttpRequestResponse) sender).Request.CookieContainer.GetCookieHeader(((HttpRequestResponse) sender).Response.ResponseUri).ToString() + "]");
   }
  }

//========================
//Class1.cs

using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO;

public class RequestState
{
 const int BUFFER_SIZE = 1024;
 public System.Text.StringBuilder RequestData;
 public byte[] BufferRead;
 public System.Net.HttpWebRequest Request;
 public System.IO.Stream ResponseStream;
 public System.Text.Decoder StreamDecode = System.Text.Encoding.GetEncoding("gb2312").GetDecoder();
 public RequestState()
 {
  BufferRead = new byte[BUFFER_SIZE];
  RequestData = new System.Text.StringBuilder("");
  Request = null;
  ResponseStream = null;
 }
}
public delegate void DataArrivalEventHandler(object sender, DataArrivalEventArgs e);
public class DataArrivalEventArgs : System.EventArgs
{
 private string mRecievedData;
 private bool mIsComplete = false;
 public DataArrivalEventArgs(string Data,bool Complete)
 {
  mRecievedData = Data;
  mIsComplete = Complete;
 }
 public string RecievedData
 {
  get
  {
   return mRecievedData;
  }
 }
 public bool IsComplete
 {
  get
  {
   return mIsComplete;
  }
 }
}

class HttpRequestResponse
{
 public static System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent(false);
 const int BUFFER_SIZE = 1024;
 public event DataArrivalEventHandler DataArrival;

 protected virtual void OnDataArrival(DataArrivalEventArgs e)
 {
  if (DataArrival != null)
  {
   DataArrival(this, e);
  }
 }
 private System.Text.Encoding mRequestEncoding = System.Text.Encoding.GetEncoding("gb2312");
 private bool mUseProxy = false;
 public bool UseProxy
 {
  get
  {
   return mUseProxy;
  }
  set
  {
   mUseProxy = value;
  }
 }

 private System.Net.WebProxy mWP = System.Net.WebProxy.GetDefaultProxy();
 public System.Net.WebProxy Proxy
 {
  get
  {
   return mWP;
  }
  set
  {
   mWP = value;
  }
 }

 private System.Net.HttpWebRequest mHWReq = null;
 public System.Net.HttpWebRequest Request
 {
  get
  {
   return mHWReq;
  }
 }
 
 private System.Net.HttpWebResponse mHWRsp = null;
 public System.Net.HttpWebResponse Response
 {
  get
  {
   return mHWRsp;
  }
 }
 public void SendRequest(string RequestURL,string RequestData,bool Async)
 {
  SendRequest(RequestURL,RequestData,"GET",Async);
 }
 public void SendRequest(string RequestURL,string RequestData,string RequestMethod,bool Async)
 {
  HttpWebRequest req;
  RequestState rs = new RequestState();
  if (RequestData != null)
  {
   int i=0, j;
   Char[] reserved = {'?', '=', '&'};
   while(i<RequestData.Length)
   {
    j=RequestData.IndexOfAny(reserved, i);
    if (j==-1)
    {
     rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, RequestData.Length-i),mRequestEncoding));
     break;
    }
    rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, j-i),mRequestEncoding));
    rs.RequestData.Append(RequestData.Substring(j,1));
    i = j+1;
   }
  }
  if (RequestMethod.ToUpper() == "POST")
  {
   byte[] Buffer = null;
   Buffer = mRequestEncoding.GetBytes(rs.RequestData.ToString());
   req =(HttpWebRequest) WebRequest.Create(RequestURL);
   req.ContentLength = Buffer.Length;
   req.Method = RequestMethod;
   req.ContentType = "application/x-www-form-urlencoded";
   Stream newStream = req.GetRequestStream();
   newStream.Write(Buffer, 0, Buffer.Length);
   newStream.Close();
  }
  else
  {
   req =(HttpWebRequest) WebRequest.Create(RequestURL + "?" + rs.RequestData.ToString());
  }
  req.Credentials = CredentialCache.DefaultCredentials;
  req.UserAgent = "[email protected]";
  req.KeepAlive = true;
  req.Headers.Set("Pragma", "no-cache");
  req.Timeout = 300000;
  if (mUseProxy)
  {
   if (mWP == null)
    mWP = System.Net.WebProxy.GetDefaultProxy();
   GlobalProxySelection.Select = mWP;
  }
  rs.Request = req;
  mHWReq = req;
  
  System.IAsyncResult r = (System.IAsyncResult) req.BeginGetResponse(new System.AsyncCallback(ResponseCallback), rs);
  if (!Async)
   allDone.WaitOne();
 }

 private void ResponseCallback(IAsyncResult ar)
 {
  RequestState rs = (RequestState) ar.AsyncState;
  System.Net.HttpWebRequest req = rs.Request;
  System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse) req.EndGetResponse(ar);
  System.IO.Stream ResponseStream = resp.GetResponseStream();
  rs.ResponseStream = ResponseStream;
  IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
 }

 private void ReadCallBack(IAsyncResult asyncResult)
 {
  RequestState rs = (RequestState)asyncResult.AsyncState;
  System.IO.Stream responseStream = rs.ResponseStream;
  int read = responseStream.EndRead( asyncResult );
  if (read > 0)
  {
   Char[] charBuffer = new Char[BUFFER_SIZE];
   int len = rs.StreamDecode.GetChars( rs.BufferRead, 0, read, charBuffer, 0 );
   System.String str = new System.String( charBuffer, 0, len);
   OnDataArrival(new DataArrivalEventArgs(str,false));
   rs.RequestData.Append(str);
   IAsyncResult ar = responseStream.BeginRead( rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
  }
  else
  {
   if(rs.RequestData.Length>1)
   {
    string strContent;
    strContent = rs.RequestData.ToString();
   }
   responseStream.Close();
   allDone.Set();
   OnDataArrival(new DataArrivalEventArgs("\n",true));
  }
  return;
 }
}


本文地址:http://com.8s8s.com/it/it45551.htm