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

原创 2003年07月03日 13:31:00

//调用示例:
/*
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???{
????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 = "playyuer@Microshaoft.com";
??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;
?}
}


C# 简易异步日志类

前言   即使是小型项目,也需要日志的功能,这里就不讨论Log4Net之类的框架,提供一个异步的、控制台输出+日志文件输出的简易日志帮助类。   正文   一、帮助类文件Logger.cs...
  • jjkliu
  • jjkliu
  • 2014年02月11日 11:27
  • 2088

事件驱动异步模式

事件驱动异步模式   前言   啥叫事件?啥叫驱动?异步又是啥玩意?这些字一个一个的我都认识,但是练起来我就不知道啥意思了,别急,往下看.   在下一篇文章中,我会...
  • shanyongxu
  • shanyongxu
  • 2015年08月26日 21:35
  • 2094

【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync

一、这里主要说明2种异步写入文件的方法: 1)异步编程模型API转为Task——使用Task.Factory.FromAsync方法 2)对于StreamWriter使用WriteAsync方法 请记...
  • huiwuhuiwu
  • huiwuhuiwu
  • 2016年12月13日 14:38
  • 2589

C#类对象的事件的定义和使用案例

项目代码: (一)主界面: using System; using System.Collections.Generic; using System.ComponentModel; using S...
  • nieweiking
  • nieweiking
  • 2014年12月10日 21:15
  • 2189

C#中事件的继承

C#中的子类无法调用父类的事件,可以通过在父类中创建一个方法来调用父类的事件,而子类通过调用父类的方法来触发事件。 class parent { protected string nam...
  • new_smile
  • new_smile
  • 2016年11月16日 14:28
  • 357

C# 并行编程 之 异步编程模型

异步编程模型的使用
  • wangzhiyu1980
  • wangzhiyu1980
  • 2015年06月17日 09:21
  • 1056

C#不同类间通过事件传递参数

C#中不同类之间传递参数的方法有许多,这里介绍其中一种方法,通过事件传递参数:    定义两个类ClassA和ClassB,要通过事件将ClassA中成员class_A,传递到ClassB,同时Cla...
  • HolaMirai
  • HolaMirai
  • 2015年06月16日 22:13
  • 1172

c#异步调用和回调

C#异步委托(异步方法调用)一: 同步调用 : 程序顺序执行时-->调用很耗时的[方法]-->阻塞当前线程-->[方法]调用完成-->继续执行。 异步调用 : ------------------...
  • u012988972
  • u012988972
  • 2015年08月14日 16:20
  • 4247

C#事件异步调用

当一个事件被触发时,订阅该事件的方法将在触发该事件的线程中执行。也就是说,订阅该事件的方法在触发事件的线程中同步执行。由此,存在一个问题:如果订阅事件的方法执行时间很长,触发事件的线程被阻塞,长时间等...
  • nncrystal
  • nncrystal
  • 2013年10月14日 16:32
  • 1675

c# Socket 异步客户端服务端

废话不多说  直接上代码 服务端: using System; using System.Collections.Generic; using System.ComponentMode...
  • everlasting51
  • everlasting51
  • 2014年02月20日 18:55
  • 1107
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!
举报原因:
原因补充:

(最多只允许输入30个字)