Mor*_*ner 12 c# httpwebrequest dotnet-httpclient
我目前正在使用使用HttpClient类发出HTTP请求的代码.虽然您可以为请求指定超时,但该值适用于整个请求(包括解析主机名,建立连接,发送请求和接收响应).
如果他们无法解析名称或建立连接,我需要一种方法使请求快速失败,但我有时也需要接收大量数据,因此不能只是减少超时.
有没有办法使用内置(BCL)类或备用HTTP客户端堆栈来实现此目的?
我简要地看了一下RestSharp和ServiceStack,但似乎都没有为连接部分提供超时(但如果我错了,请纠正我).
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)
这里的时间只是例如,您必须根据您的需要进行调整.