zoukankan      html  css  js  c++  java
  • 实现HttpWebRequest.BeginGetResponse的超时控制

    代码
    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();

    }
  • 相关阅读:
    mysql设置不区分大小写
    java.lang.StackOverflowError: null
    与或非
    mysql自动备份
    Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 不支持“variant”数据类型。
    MySQL主从复制 + Mycat实现读写分离
    Swing做的非阻塞式仿飞秋聊天程序
    Hudson + SVN + Maven 持续集成实现自动化编译、打包、部署(over SSH 和 Deploy war/ear to a container 两种部署方式)
    CMake安装(源码方式)
    多线程使用实例
  • 原文地址:https://www.cnblogs.com/wudingfeng/p/1620941.html
Copyright © 2011-2022 走看看