我有注册事件的HttpWebRequest_BeginGetResponse rs = new HttpWebRequest_BeginGetResponse(); rs.ReadOver += new HttpWebRequest_BeginGetResponse.ReadOverHandler(rs_ReadOver);
完整代码如下 public class HttpWebRequest_BeginGetResponse { public class RequestState { // This class stores the State of the request. const int BUFFER_SIZE = 1024; public System.Text.Encoder CharacterSet; 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 static ManualResetEvent allDone = new ManualResetEvent(false); const int BUFFER_SIZE = 1024; const int DefaultTimeout = 2 * 60 * 1000; // 2 minutes timeout public delegate void ReadOverHandler(StringBuilder requestData); public event ReadOverHandler ReadOver; public HttpWebRequest_BeginGetResponse() { } // Abort the request if the timer fires. private void TimeoutCallback(object state, bool timedOut) { if (timedOut) { HttpWebRequest request = state as HttpWebRequest; if (request != null) { request.Abort(); } } } public void GetData(string Url) { try { // Create a HttpWebrequest object to the desired URL. HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(Url); /** * If you are behind a firewall and you do not have your browser proxy setup * you need to use the following proxy creation code. // Create a proxy object. WebProxy myProxy = new WebProxy(); // Associate a new Uri object to the _wProxy object, using the proxy address // selected by the user. myProxy.Address = new Uri( "http://myproxy ");
// Finally, initialize the Web request object proxy property with the _wProxy // object. myHttpWebRequest.Proxy=myProxy; ***/ // Create an instance of the RequestState and assign the previous myHttpWebRequest // object to it 's request field. RequestState myRequestState = new RequestState(); myRequestState.request = myHttpWebRequest; // Start the asynchronous request. IAsyncResult result = (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState); // this line impliments the timeout, if there is a timeout, the callback fires and the request becomes aborted ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true); // The response came in the allowed time. The work processing will happen in the // callback function. allDone.WaitOne(); // Release the HttpWebResponse resource. myRequestState.response.Close(); } catch (WebException e) { //Console.WriteLine("\nMain Exception raised! "); //Console.WriteLine("\nMessage:{0} ", e.Message); //Console.WriteLine("\nStatus:{0} ", e.Status); //Console.WriteLine("Press any key to continue.......... "); } catch (Exception e) { //Console.WriteLine("\nMain Exception raised! "); //Console.WriteLine("Source :{0} ", e.Source); //Console.WriteLine("Message :{0} ", e.Message); //Console.WriteLine("Press any key to continue.......... "); Console.Read(); } } private void RespCallback(IAsyncResult asynchronousResult) { try { // State of request is asynchronous. RequestState myRequestState = (RequestState)asynchronousResult.AsyncState; HttpWebRequest myHttpWebRequest = myRequestState.request; myRequestState.response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult); // Read the response into a Stream object. Stream responseStream = myRequestState.response.GetResponseStream(); myRequestState.streamResponse = responseStream; // Begin the Reading of the contents of the HTML page and print it to the console. IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState); return; } catch (WebException e) { //Console.WriteLine("\nRespCallback Exception raised! "); //Console.WriteLine("\nMessage:{0} ", e.Message); //Console.WriteLine("\nStatus:{0} ", e.Status); } allDone.Set(); } private void ReadCallBack(IAsyncResult asyncResult) { try { RequestState myRequestState = (RequestState)asyncResult.AsyncState; Stream responseStream = myRequestState.streamResponse; int read = responseStream.EndRead(asyncResult); // Read the HTML page and then print it to the console. if (read > 0) { myRequestState.requestData.Append(Encoding.UTF8.GetString(myRequestState.BufferRead, 0, read)); IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState); return; } else { //Console.WriteLine("\nThe contents of the Html page are : "); if (myRequestState.requestData.Length > 1) { //string stringContent; //stringContent = myRequestState.requestData.ToString(); //Console.WriteLine(stringContent); Model.Helper.BaiduMapsGeocoder b = (Model.Helper.BaiduMapsGeocoder)Common.Json.DeserializeObject(myRequestState.requestData.ToString(), typeof(Model.Helper.BaiduMapsGeocoder)); //触发事件 ReadOver(myRequestState.requestData); } //Console.WriteLine("Press any key to continue.......... "); //Console.ReadLine(); responseStream.Close(); } } catch (WebException e) { //Console.WriteLine("\nReadCallBack Exception raised! "); //Console.WriteLine("\nMessage:{0} ", e.Message); //Console.WriteLine("\nStatus:{0} ", e.Status); } allDone.Set(); } }
{
if(ReadOver!=null)
ReadOver(myRequestState.requestData);
}
rs.ReadOver += new HttpWebRequest_BeginGetResponse.ReadOverHandler(rs_ReadOver);
{
public class RequestState
{
// This class stores the State of the request.
const int BUFFER_SIZE = 1024;
public System.Text.Encoder CharacterSet;
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 static ManualResetEvent allDone = new ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
const int DefaultTimeout = 2 * 60 * 1000; // 2 minutes timeout public delegate void ReadOverHandler(StringBuilder requestData);
public event ReadOverHandler ReadOver; public HttpWebRequest_BeginGetResponse()
{ } // Abort the request if the timer fires.
private void TimeoutCallback(object state, bool timedOut)
{
if (timedOut)
{
HttpWebRequest request = state as HttpWebRequest;
if (request != null)
{
request.Abort();
}
}
} public void GetData(string Url)
{ try
{
// Create a HttpWebrequest object to the desired URL. HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(Url);
/**
* If you are behind a firewall and you do not have your browser proxy setup
* you need to use the following proxy creation code. // Create a proxy object.
WebProxy myProxy = new WebProxy(); // Associate a new Uri object to the _wProxy object, using the proxy address
// selected by the user.
myProxy.Address = new Uri( "http://myproxy ");
// Finally, initialize the Web request object proxy property with the _wProxy
// object.
myHttpWebRequest.Proxy=myProxy;
***/ // Create an instance of the RequestState and assign the previous myHttpWebRequest
// object to it 's request field.
RequestState myRequestState = new RequestState();
myRequestState.request = myHttpWebRequest;
// Start the asynchronous request.
IAsyncResult result =
(IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState); // this line impliments the timeout, if there is a timeout, the callback fires and the request becomes aborted
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true); // The response came in the allowed time. The work processing will happen in the
// callback function.
allDone.WaitOne(); // Release the HttpWebResponse resource.
myRequestState.response.Close();
}
catch (WebException e)
{
//Console.WriteLine("\nMain Exception raised! ");
//Console.WriteLine("\nMessage:{0} ", e.Message);
//Console.WriteLine("\nStatus:{0} ", e.Status);
//Console.WriteLine("Press any key to continue.......... ");
}
catch (Exception e)
{
//Console.WriteLine("\nMain Exception raised! ");
//Console.WriteLine("Source :{0} ", e.Source);
//Console.WriteLine("Message :{0} ", e.Message);
//Console.WriteLine("Press any key to continue.......... ");
Console.Read();
}
}
private void RespCallback(IAsyncResult asynchronousResult)
{
try
{
// State of request is asynchronous.
RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
HttpWebRequest myHttpWebRequest = myRequestState.request;
myRequestState.response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult); // Read the response into a Stream object.
Stream responseStream = myRequestState.response.GetResponseStream();
myRequestState.streamResponse = responseStream; // Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
catch (WebException e)
{
//Console.WriteLine("\nRespCallback Exception raised! ");
//Console.WriteLine("\nMessage:{0} ", e.Message);
//Console.WriteLine("\nStatus:{0} ", e.Status);
}
allDone.Set();
}
private void ReadCallBack(IAsyncResult asyncResult)
{
try
{ RequestState myRequestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = myRequestState.streamResponse;
int read = responseStream.EndRead(asyncResult);
// Read the HTML page and then print it to the console.
if (read > 0)
{ myRequestState.requestData.Append(Encoding.UTF8.GetString(myRequestState.BufferRead, 0, read)); IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
else
{
//Console.WriteLine("\nThe contents of the Html page are : ");
if (myRequestState.requestData.Length > 1)
{
//string stringContent;
//stringContent = myRequestState.requestData.ToString();
//Console.WriteLine(stringContent); Model.Helper.BaiduMapsGeocoder b = (Model.Helper.BaiduMapsGeocoder)Common.Json.DeserializeObject(myRequestState.requestData.ToString(), typeof(Model.Helper.BaiduMapsGeocoder)); //触发事件
ReadOver(myRequestState.requestData);
}
//Console.WriteLine("Press any key to continue.......... ");
//Console.ReadLine(); responseStream.Close();
} }
catch (WebException e)
{
//Console.WriteLine("\nReadCallBack Exception raised! ");
//Console.WriteLine("\nMessage:{0} ", e.Message);
//Console.WriteLine("\nStatus:{0} ", e.Status);
}
allDone.Set(); }
}
自带的控件你一双击他就自动注册了,在designer.cs文件中。是个部分类。
先注册了事件这里肯定不会报空错误啊
//触发事件
if(ReadOver!=null)
{
ReadOver(myRequestState.requestData);
}