更改我的代码以使用异步方法而不是同步方法将强制我的 WebClient 永远不会超时(20 分钟++)
Changing my code to use async methods instead of sync methods will force my WebClient to never timeout (20 minute++)
我有2个asp.net MVC web应用,如下:-
ApplicationA。这是部署在 iis-8 下的 Asp.net mvc-4。
应用程序 B。这是部署在 iis-8 下的 Asp.net mvc-5。
现在在我的 ApplicationA 中,我有以下方法,它将调用 applicationB 上的操作方法 (home/sync),如下所示:-
public List<Technology> GetTechnology(int? currentfiltertype)
{
try
{
using (WebClient wc = new WebClient())
{
string url = currentURL + "home/sync?filtertype=" + currentfiltertype;
wc.Headers.Add("Authorization", token);
string json = wc.DownloadString(url);
List<Technology> result = JsonConvert.DeserializeObject<List<Technology>>(json);
return result;
}
}
catch (Exception e){}
}
现在我注意到,当 WebClient
调用操作方法时,该方法在大约 2 分钟内没有收到响应,它会引发超时异常。但是由于 Web 应用程序 B 上的 home/sync
操作方法需要大约 30 分钟才能完成。所以我正在寻找一种解决方案来延长 Web 客户端超时时间。所以我尝试更改我的代码以使用如下异步方法,主要是将 wc.DownloadString
替换为 wc.DownloadStringTaskAsync
如下:-
public async Task<List<Technology>> GetTechnology(int? currentfiltertype)
{
try
{
using (WebClient wc = new WebClient())
{
string url = currentURL + "home/sync?filtertype=" + currentfiltertype;
wc.Headers.Add("Authorization", token);
string json = await wc.DownloadStringTaskAsync(url);
List<Technology> result = JsonConvert.DeserializeObject<List<Technology>>(json);
return result;
}
}
catch (Exception e) {}
}
现在看来 WebClient
永远不会过期...我尝试调用操作方法,Web 客户端一直等待响应超过 20 分钟而没有引发任何超时异常,然后它收到了来自 Web 应用程序 B 的响应并且一切正常..
所以任何人都可以建议为什么更改我的代码以使用上面代码中所示的异步方法,导致 WebClient
不超时?我无法理解使用异步逻辑和延长 Web 客户端超时时间之间的关系(不确定 WebClient 是否会在异步方法中超时!!)?
can anyone advice why changing my code to use async methods as shown in the above code, caused the WebClient to not timeout ??
答案有点绕:WebClient
is based on WebRequest
, and HttpWebRequest
's Timeout
property is only honored for synchronous requests.
(noy sure if the WebClient will ever timeout inside async methods!!)?
它不直接支持异步超时,但它确实支持(its own kind of) cancellation,您可以在定时器后触发。
我有2个asp.net MVC web应用,如下:-
ApplicationA。这是部署在 iis-8 下的 Asp.net mvc-4。
应用程序 B。这是部署在 iis-8 下的 Asp.net mvc-5。
现在在我的 ApplicationA 中,我有以下方法,它将调用 applicationB 上的操作方法 (home/sync),如下所示:-
public List<Technology> GetTechnology(int? currentfiltertype)
{
try
{
using (WebClient wc = new WebClient())
{
string url = currentURL + "home/sync?filtertype=" + currentfiltertype;
wc.Headers.Add("Authorization", token);
string json = wc.DownloadString(url);
List<Technology> result = JsonConvert.DeserializeObject<List<Technology>>(json);
return result;
}
}
catch (Exception e){}
}
现在我注意到,当 WebClient
调用操作方法时,该方法在大约 2 分钟内没有收到响应,它会引发超时异常。但是由于 Web 应用程序 B 上的 home/sync
操作方法需要大约 30 分钟才能完成。所以我正在寻找一种解决方案来延长 Web 客户端超时时间。所以我尝试更改我的代码以使用如下异步方法,主要是将 wc.DownloadString
替换为 wc.DownloadStringTaskAsync
如下:-
public async Task<List<Technology>> GetTechnology(int? currentfiltertype)
{
try
{
using (WebClient wc = new WebClient())
{
string url = currentURL + "home/sync?filtertype=" + currentfiltertype;
wc.Headers.Add("Authorization", token);
string json = await wc.DownloadStringTaskAsync(url);
List<Technology> result = JsonConvert.DeserializeObject<List<Technology>>(json);
return result;
}
}
catch (Exception e) {}
}
现在看来 WebClient
永远不会过期...我尝试调用操作方法,Web 客户端一直等待响应超过 20 分钟而没有引发任何超时异常,然后它收到了来自 Web 应用程序 B 的响应并且一切正常..
所以任何人都可以建议为什么更改我的代码以使用上面代码中所示的异步方法,导致 WebClient
不超时?我无法理解使用异步逻辑和延长 Web 客户端超时时间之间的关系(不确定 WebClient 是否会在异步方法中超时!!)?
can anyone advice why changing my code to use async methods as shown in the above code, caused the WebClient to not timeout ??
答案有点绕:WebClient
is based on WebRequest
, and HttpWebRequest
's Timeout
property is only honored for synchronous requests.
(noy sure if the WebClient will ever timeout inside async methods!!)?
它不直接支持异步超时,但它确实支持(its own kind of) cancellation,您可以在定时器后触发。