110,561
社区成员
发帖
与我相关
我的任务
分享
class RequestState
{
const int BUFFER_SIZE = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public HttpWebRequest Request;
public HttpWebResponse Response;
public Stream StreamResponse;
public RequestState()
{
BufferRead = new byte[BUFFER_SIZE];
RequestData = new StringBuilder("");
Request = null;
StreamResponse = null;
}
}
public class HtmlHelper
{
/// <summary>异步请求,读取分块数据事件</summary>
public event Action<string> Event_IAsyncReadDataing;
/// <summary>异步请求,读取分块数据结束事件</summary>
public event Action<string> Event_IAsyncReadEnd;
//如果超时,中断请求
private void TimeoutCallback(object state, bool timeOut)
{
if (timeOut)
{
HttpWebRequest request = state as HttpWebRequest;
if (request != null)
request.Abort();
}
}
/// <summary>异步请求获取Html</summary>
/// <param name="getUrl">地址</param>
/// <param name="submitData">提交数据</param>
/// <param name="cookieContainer">cookie容器</param>
/// <param name="header">头类</param>
public void BeginGetHtml(string getUrl, string submitData, CookieContainer cookieContainer, HttpHeader header, Encoding encoding)
{
_Encoding = encoding;
AllDone.Reset();//恢复阻塞状态
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(getUrl);
request.CookieContainer = cookieContainer;
if (header != null)
{
request.ContentType = header.ContentType;
request.ServicePoint.ConnectionLeaseTimeout = header.MaxTry;
request.Accept = header.Accept;
request.UserAgent = header.UserAgent;
request.Method = header.Method;
request.KeepAlive = header.KeepAlive;
request.Referer = header.Referer;
}
request.ProtocolVersion = HttpVersion.Version11;
request.AllowAutoRedirect = true;
request.MaximumAutomaticRedirections = 1;
if (getUrl.ToLower().StartsWith("https"))
{
request.ClientCertificates.Add(_Certificate);
}
//写入提交数据
if (header.Method.ToLower() == "post")
{
request.AllowAutoRedirect = false;
if (!string.IsNullOrWhiteSpace(submitData))
{
byte[] postdatabyte = Encoding.Default.GetBytes(submitData);
request.ContentLength = postdatabyte.Length;
Stream stream;
stream = request.GetRequestStream();
stream.Write(postdatabyte, 0, postdatabyte.Length);
stream.Close();
}
}
RequestState myRequestState = new RequestState();
myRequestState.Request = request;
//开始异步请求
IAsyncResult result = (IAsyncResult)request.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), request, _DefaultTimeout, true);
AllDone.WaitOne();//阻断线程,等待执行完成
myRequestState.Response.Close();
}
catch (WebException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
}
//异步回调
private void RespCallback(IAsyncResult asynchronousResult)
{
try
{
RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
HttpWebRequest myHttpWebRequest = myRequestState.Request;
myRequestState.Response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult);
Stream responseStream = myRequestState.Response.GetResponseStream();
myRequestState.StreamResponse = responseStream;
IAsyncResult asynchoronosInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, _BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
catch (WebException ex)
{
throw ex;
}
//AllDone.Set();
}
//异步分块读取响应Stream的字符串,在此处触发事件,用于提取返回的分块数据
private void ReadCallBack(IAsyncResult asyncResult)
{
try
{
RequestState myRequestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = myRequestState.StreamResponse;
int read = responseStream.EndRead(asyncResult);
//如果有可读数据,读取,递归
if (read > 0)
{
myRequestState.RequestData.Append(_Encoding.GetString(myRequestState.BufferRead, 0, read));
//if (Event_IAsyncReadDataing != null)
//{
// Event_IAsyncReadDataing(myRequestState.RequestData.ToString());
//}
IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.BufferRead, 0, _BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
}
else//没有可读数据(数据读取完成)
{
responseStream.Close();
AllDone.Set();
if (Event_IAsyncReadEnd != null)
{
Event_IAsyncReadEnd(myRequestState.RequestData.ToString());
}
}
}
catch (WebException ex)
{
AllDone.Set(); throw ex;
}
}
}
HtmlHelper htmlHelper = new HtmlHelper();
public Form1()
{
InitializeComponent();
htmlHelper.Event_IAsyncReadDataing += new Action<string>(htmlHelper_BackCallHtmlString);
htmlHelper.Event_IAsyncReadEnd += new Action<string>(htmlHelper_Event_IAsyncReadEnd);
}
//数据读取结束事件
void htmlHelper_Event_IAsyncReadEnd(string obj)
{
this.Invoke(new Action(() => {
textBox1.Text += obj;
textBox1.Select(textBox1.Text.Length, 0);
textBox1.ScrollToCaret();
}));
}
//按钮单击,循环50次
private void button2_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i < 50; i++)
{
htmlHelper.BeginGetHtml("http://120.82.64.9", null, null, new HtmlHelper.HttpHeader() { Method = "post" }, Encoding.Default);
Thread.Sleep(1000);
}
}));
t1.Start();
}