サーバーの信頼性が少し低いサードパーティのWebサイトにWebサービス要求呼び出しを行おうとしています。このサイトへのリクエストにタイムアウトを設定する方法はありますか?この擬似コードのようなもの:
try // for 1 minute
{
// Make web request here
using (WebClient client new WebClient()) //...etc.
}
catch
{
}
Timeout プロパティを使用できます:
_var request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
request.Timeout = 1000; //Timeout after 1000 ms
using (var stream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
_
更新:
XElement.Load(uri)
に関するコメントセクションの質問に答えるには、次のようにします。
_var request = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com/feeds");
request.Timeout = 1000; //Timeout after 1000 ms
using (var stream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(stream))
{
var xel = XElement.Load(reader);
}
_
WebClientは、当然、カスタムタイムアウトをサポートしていません。ただし、カスタムタイムアウトを使用して派生クラスを簡単に構築できます。
public class TimeoutWebClient : WebClient
{
private int _timeOut = 10000;
public int TimeOut
{
get
{
return _timeOut;
}
set
{
_timeOut = value;
}
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest webRequest = base.GetWebRequest(address);
webRequest.Timeout = _timeOut;
return webRequest;
}
}
多分あなたは一緒に行くべきです
System.Net.WebRequest.Timeout
サーバー側からWebTimeout例外をチェックしてから、SignalRを使用してタイムアウトメッセージをクライアントにアクティブに送り返すことができます。
var request = (HttpWebRequest)WebRequest.Create("http://www.your_third_parties_page.com");
request.Timeout = 1000; //Timeout after 1000 ms
try
{
using (var stream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.Timeout)
{
//If timeout then send SignalR message to inform the clients...
var context = GlobalHost.ConnectionManager.GetHubContext<YourHub>();
context.Clients.All.addNewMessageToPage("This behavious have been processing too long!");
}
}
あらゆる種類のネットワークを含む.NetFramework内の多くのクラスには、Timeoutプロパティが含まれています。たとえば、WebRequestクラス(System.Net)にはそのようなプロパティがあります