实现HttpWebRequest.BeginGetResponse的超时控制

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;


public class RequestState
{
// This class stores the State of the request.
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 ;
}
}

class HttpWebRequest_BeginGetResponse
{
public static ManualResetEvent allDone = new ManualResetEvent( false );
const int BUFFER_SIZE = 1024 ;
const int DefaultTimeout = 2 * 60 * 1000 ; // 2 minutes timeout

// Abort the request if the timer fires.
private static void TimeoutCallback( object state, bool timedOut) {
if (timedOut) {
HttpWebRequest request
= state as HttpWebRequest;
if (request != null ) {
request.Abort();
}
}
}

static void Main()
{

try
{
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create( " http://www.contoso.com " );


/* *
* 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 its request field.
RequestState myRequestState = new RequestState();
myRequestState.request
= myHttpWebRequest;


// Start the asynchronous request.
IAsyncResult result =
(IAsyncResult) myHttpWebRequest.BeginGetResponse(
new AsyncCallback(RespCallback),myRequestState);

// this line implements 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 static 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 static 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.ASCII.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);
}
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();

}

 

转载于:https://www.cnblogs.com/wudingfeng/archive/2009/12/10/1620941.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值