I'm making a request to a remote web server that is currently offline (on purpose).
I'd like to figure out the best way to time out the request. Basically if the request runs longer than "X" milliseconds, then exit the request and return a null
response.
Currently the web request just sits there waiting for a response.....
How would I best approach this problem?
Here's a current code snippet
public JsonpResult About(string HomePageUrl)
{
Models.Pocos.About about = null;
if (HomePageUrl.RemoteFileExists())
{
// Using the Html Agility Pack, we want to extract only the
// appropriate data from the remote page.
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(HomePageUrl);
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='wrapper1-border']");
if (node != null)
{
about = new Models.Pocos.About { html = node.InnerHtml };
}
//todo: look into whether this else statement is necessary
else
{
about = null;
}
}
return this.Jsonp(about);
}
Retrieve your url web page through this method:
private static string retrieveData(string url)
{
// used to build entire input
StringBuilder sb = new StringBuilder();
// used on each read operation
byte[] buf = new byte[8192];
// prepare the web page we will be asking for
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url);
request.Timeout = 10; //10 millisecond
// execute the request
HttpWebResponse response = (HttpWebResponse)
request.GetResponse();
// we will read data via the response stream
Stream resStream = response.GetResponseStream();
string tempString = null;
int count = 0;
do
{
// fill the buffer with data
count = resStream.Read(buf, 0, buf.Length);
// make sure we read some data
if (count != 0)
{
// translate from bytes to ASCII text
tempString = Encoding.ASCII.GetString(buf, 0, count);
// continue building the string
sb.Append(tempString);
}
}
while (count > 0); // any more data to read?
return sb.ToString();
}
And to use the HTML Agility pack and retrive the html tag like this:
public static string htmlRetrieveInfo()
{
string htmlSource = retrieveData("http://example.com/test.html");
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlSource);
if (doc.DocumentNode.SelectSingleNode("//body") != null)
{
HtmlNode node = doc.DocumentNode.SelectSingleNode("//body");
}
return node.InnerHtml;
}
Html Agility Pack is open souce. Thats why you may modify source yurself. For first add this code to class HtmlWeb:
private int _timeout = 20000;
public int Timeout
{
get { return _timeout; }
set
{
if (_timeout < 1)
throw new ArgumentException("Timeout must be greater then zero.");
_timeout = value;
}
}
Then find this method
private HttpStatusCode Get(Uri uri, string method, string path, HtmlDocument doc, IWebProxy proxy, ICredentials creds)
and modify it:
req = WebRequest.Create(uri) as HttpWebRequest;
req.Method = method;
req.UserAgent = UserAgent;
req.Timeout = Timeout; //add this
Or something like that:
htmlWeb.PreRequest = request =>
{
request.Timeout = 15000;
return true;
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With