如何在执行Web请求时指定仅连接超时?

Mor*_*ner 12 c# httpwebrequest dotnet-httpclient

我目前正在使用使用HttpClient类发出HTTP请求的代码.虽然您可以为请求指定超时,但该值适用于整个请求(包括解析主机名,建立连接,发送请求和接收响应).

如果他们无法解析名称或建立连接,我需要一种方法使请求快速失败,但我有时也需要接收大量数据,因此不能只是减少超时.

有没有办法使用内置(BCL)类或备用HTTP客户端堆栈来实现此目的?

我简要地看了一下RestSharp和ServiceStack,但似乎都没有为连接部分提供超时(但如果我错了,请纠正我).

Lud*_*ltz 5

Timer如果连接花费太多时间,您可以使用a 来中止请求.在经过时间后添加事件.你可以使用这样的东西:

static WebRequest request;
private static void sendAndReceive()
{
    // The request with a big timeout for receiving large amout of data
    request = HttpWebRequest.Create("http://localhost:8081/index/");
    request.Timeout = 100000;

    // The connection timeout
    var ConnectionTimeoutTime = 100;
    Timer timer = new Timer(ConnectionTimeoutTime);
    timer.Elapsed += connectionTimeout;
    timer.Enabled = true;

    Console.WriteLine("Connecting...");
    try
    {
        using (var stream = request.GetRequestStream())
        {
            Console.WriteLine("Connection success !");
            timer.Enabled = false;

            /*
             *  Sending data ...
             */
            System.Threading.Thread.Sleep(1000000);
        }

        using (var response = (HttpWebResponse)request.GetResponse())
        {
            /*
             *  Receiving datas...
             */
        }
    }
    catch (WebException e)
    {
        if(e.Status==WebExceptionStatus.RequestCanceled) 
            Console.WriteLine("Connection canceled (timeout)");
        else if(e.Status==WebExceptionStatus.ConnectFailure)
            Console.WriteLine("Can't connect to server");
        else if(e.Status==WebExceptionStatus.Timeout)
            Console.WriteLine("Timeout");
        else
            Console.WriteLine("Error");
    }
}

static void connectionTimeout(object sender, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("Connection failed...");
    Timer timer = (Timer)sender;
    timer.Enabled = false;

    request.Abort();
}
Run Code Online (Sandbox Code Playgroud)

这里的时间只是例如,您必须根据您的需要进行调整.

  • 你是第一个能够真正解决问题的东西.它不是很漂亮,但仍然有用! (2认同)