Skip to content

Commit 24ce9cb

Browse files
committed
修改HttpUtility里HttpClient的Post和Get方法timeOut超时的处理(通过CancellationToken主动取消任务实现);
注释了原代码直接设置httpClient.Timeout的操作(因为这是该Client的全局共享值,会影响同Client实例下的其他请求超时时间)。
1 parent 7261ff1 commit 24ce9cb

File tree

3 files changed

+123
-72
lines changed

3 files changed

+123
-72
lines changed

src/Senparc.CO2NET/Utilities/HttpUtility/HttpGet/Get.cs

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public static void Download(
161161
/// <param name="filePathName">保存文件的路径,如果下载文件包含文件名,按照文件名储存,否则将分配Ticks随机文件名</param>
162162
/// <param name="timeOut">超时时间</param>
163163
/// <returns></returns>
164-
public static string Download(IServiceProvider serviceProvider, string url, string filePathName, int timeOut = 999)
164+
public static string Download(IServiceProvider serviceProvider, string url, string filePathName, int timeOut = Config.TIME_OUT)
165165
{
166166
var dir = Path.GetDirectoryName(filePathName) ?? "/";
167167
Directory.CreateDirectory(dir);
@@ -207,35 +207,42 @@ public static string Download(IServiceProvider serviceProvider, string url, stri
207207

208208
#else
209209
System.Net.Http.HttpClient httpClient = serviceProvider.GetRequiredService<SenparcHttpClient>().Client;
210-
using (var responseMessage = httpClient.GetAsync(url).Result)
210+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
211211
{
212-
if (responseMessage.StatusCode == HttpStatusCode.OK)
212+
try
213213
{
214-
string responseFileName = null;
215-
//ContentDisposition可能会为Null
216-
if (responseMessage.Content.Headers.ContentDisposition != null &&
217-
responseMessage.Content.Headers.ContentDisposition.FileName != null &&
218-
responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
214+
using (var responseMessage = httpClient.GetAsync(url, cancellationToken: cts.Token).Result)
219215
{
220-
responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
221-
}
216+
if (responseMessage.StatusCode == HttpStatusCode.OK)
217+
{
218+
string responseFileName = null;
219+
//ContentDisposition可能会为Null
220+
if (responseMessage.Content.Headers.ContentDisposition != null &&
221+
responseMessage.Content.Headers.ContentDisposition.FileName != null &&
222+
responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
223+
{
224+
responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
225+
}
226+
227+
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
228+
using (var fs = File.Open(fullName, FileMode.Create))
229+
{
230+
using (var responseStream = responseMessage.Content.ReadAsStreamAsync().Result)
231+
{
232+
responseStream.CopyTo(fs);
233+
fs.Flush();
234+
}
235+
}
236+
return fullName;
222237

223-
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
224-
using (var fs = File.Open(fullName, FileMode.Create))
225-
{
226-
using (var responseStream = responseMessage.Content.ReadAsStreamAsync().Result)
238+
}
239+
else
227240
{
228-
responseStream.CopyTo(fs);
229-
fs.Flush();
241+
return null;
230242
}
231243
}
232-
return fullName;
233-
234-
}
235-
else
236-
{
237-
return null;
238244
}
245+
catch { throw; }
239246
}
240247
#endif
241248
}
@@ -320,35 +327,42 @@ public static async Task<string> DownloadAsync(
320327
#else
321328
System.Net.Http.HttpClient httpClient = serviceProvider.GetRequiredService<SenparcHttpClient>().Client;
322329
#endif
323-
httpClient.Timeout = TimeSpan.FromMilliseconds(timeOut);
324-
using (var responseMessage = await httpClient.GetAsync(url).ConfigureAwait(false))
330+
//httpClient.Timeout = TimeSpan.FromMilliseconds(timeOut); // 此处建议不要直接修改httpClient的Timeout属性,因为这是该Client的全局共享值,会影响同Client实例下的其他请求超时时间
331+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
325332
{
326-
if (responseMessage.StatusCode == HttpStatusCode.OK)
333+
try
327334
{
328-
string responseFileName = null;
329-
//ContentDisposition可能会为Null
330-
if (responseMessage.Content.Headers.ContentDisposition != null &&
331-
responseMessage.Content.Headers.ContentDisposition.FileName != null &&
332-
responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
335+
using (var responseMessage = await httpClient.GetAsync(url, cancellationToken: cts.Token).ConfigureAwait(false))
333336
{
334-
responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
335-
}
336-
337-
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
338-
using (var fs = File.Open(fullName, FileMode.Create))
339-
{
340-
using (var responseStream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
337+
if (responseMessage.StatusCode == HttpStatusCode.OK)
341338
{
342-
await responseStream.CopyToAsync(fs).ConfigureAwait(false);
343-
await fs.FlushAsync().ConfigureAwait(false);
339+
string responseFileName = null;
340+
//ContentDisposition可能会为Null
341+
if (responseMessage.Content.Headers.ContentDisposition != null &&
342+
responseMessage.Content.Headers.ContentDisposition.FileName != null &&
343+
responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
344+
{
345+
responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
346+
}
347+
348+
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
349+
using (var fs = File.Open(fullName, FileMode.Create))
350+
{
351+
using (var responseStream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
352+
{
353+
await responseStream.CopyToAsync(fs).ConfigureAwait(false);
354+
await fs.FlushAsync().ConfigureAwait(false);
355+
}
356+
}
357+
return fullName;
358+
}
359+
else
360+
{
361+
return null;
344362
}
345363
}
346-
return fullName;
347-
}
348-
else
349-
{
350-
return null;
351364
}
365+
catch { throw; }
352366
}
353367
}
354368
#endregion

src/Senparc.CO2NET/Utilities/HttpUtility/HttpGet/RequestUtility.Get.cs

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,7 @@ public static string HttpGet(
141141
#else
142142
var handler = HttpClientHelper.GetHttpClientHandler(null, SenparcHttpClientWebProxy, DecompressionMethods.GZip);
143143

144-
145144
HttpClient httpClient = serviceProvider.GetRequiredService<SenparcHttpClient>().Client;
146-
147145
return httpClient.GetStringAsync(url).Result;
148146
#endif
149147
}
@@ -188,11 +186,18 @@ public static string HttpGet(
188186

189187
var httpClient = HttpGet_Common_NetCore(serviceProvider, url, cookieContainer, encoding, cer, refererUrl, useAjax, headerAddition, timeOut);
190188

191-
var response = httpClient.GetAsync(url).GetAwaiter().GetResult();//获取响应信息
189+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
190+
{
191+
try
192+
{
193+
var response = httpClient.GetAsync(url, cancellationToken: cts.Token).GetAwaiter().GetResult();//获取响应信息
192194

193-
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
195+
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
194196

195-
return response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
197+
return response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
198+
}
199+
catch { throw; }
200+
}
196201
#endif
197202
}
198203

@@ -240,15 +245,22 @@ public static HttpWebResponse HttpResponseGet(string url, CookieContainer cookie
240245
public static HttpResponseMessage HttpResponseGet(
241246
IServiceProvider serviceProvider,
242247
string url, CookieContainer cookieContainer = null, Encoding encoding = null, X509Certificate2 cer = null,
243-
string refererUrl = null, bool useAjax = false, Dictionary<string, string> headerAddition = null, int timeOut = Config.TIME_OUT)
248+
string refererUrl = null, bool useAjax = false, Dictionary<string, string> headerAddition = null, int timeOut = Config.TIME_OUT)
244249
{
245250
var httpClient = HttpGet_Common_NetCore(serviceProvider, url, cookieContainer, encoding, cer, refererUrl, useAjax, headerAddition, timeOut);
246-
var task = httpClient.GetAsync(url);
247-
HttpResponseMessage response = task.Result;
251+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
252+
{
253+
try
254+
{
255+
var task = httpClient.GetAsync(url, cancellationToken: cts.Token);
256+
HttpResponseMessage response = task.Result;
248257

249-
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
258+
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
250259

251-
return response;
260+
return response;
261+
}
262+
catch { throw; }
263+
}
252264
}
253265

254266
#endif
@@ -325,13 +337,20 @@ public static async Task<string> HttpGetAsync(
325337
#else
326338
var httpClient = HttpGet_Common_NetCore(serviceProvider, url, cookieContainer, encoding, cer, refererUrl, useAjax, headerAddition, timeOut);
327339

328-
var response = await httpClient.GetAsync(url).ConfigureAwait(false);//获取响应信息
340+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
341+
{
342+
try
343+
{
344+
var response = await httpClient.GetAsync(url, cancellationToken: cts.Token).ConfigureAwait(false);//获取响应信息
329345

330-
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
346+
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
331347

332-
var retString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
348+
var retString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
333349

334-
return retString;
350+
return retString;
351+
}
352+
catch { throw; }
353+
}
335354
#endif
336355
}
337356

@@ -379,15 +398,22 @@ public static async Task<HttpWebResponse> HttpResponseGetAsync(string url, Cooki
379398
public static async Task<HttpResponseMessage> HttpResponseGetAsync(
380399
IServiceProvider serviceProvider,
381400
string url, CookieContainer cookieContainer = null, Encoding encoding = null, X509Certificate2 cer = null,
382-
string refererUrl = null, bool useAjax = false, Dictionary<string, string> headerAddition = null, int timeOut = Config.TIME_OUT)
401+
string refererUrl = null, bool useAjax = false, Dictionary<string, string> headerAddition = null, int timeOut = Config.TIME_OUT)
383402
{
384403
var httpClient = HttpGet_Common_NetCore(serviceProvider, url, cookieContainer, encoding, cer, refererUrl, useAjax, headerAddition, timeOut);
385-
var task = httpClient.GetAsync(url);
386-
HttpResponseMessage response = await task;
404+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
405+
{
406+
try
407+
{
408+
var task = httpClient.GetAsync(url, cancellationToken: cts.Token);
409+
HttpResponseMessage response = await task;
387410

388-
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
411+
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
389412

390-
return response;
413+
return response;
414+
}
415+
catch { throw; }
416+
}
391417
}
392418

393419
#endif

src/Senparc.CO2NET/Utilities/HttpUtility/HttpPost/RequestUtility.Post.cs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ public static partial class RequestUtility
8484
{
8585
#region 静态公共方法
8686

87-
88-
89-
9087
#if NET45
9188

9289
/// <summary>
@@ -621,10 +618,17 @@ public static SenparcHttpResponse HttpResponsePost(
621618
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
622619
return new SenparcHttpResponse(response);
623620
#else
624-
HttpContent hc;
625-
var client = HttpPost_Common_NetCore(serviceProvider, url, out hc, cookieContainer, postStream, fileDictionary, refererUrl, encoding, certName, useAjax, headerAddition, timeOut, checkValidationResult, contentType);
621+
var client = HttpPost_Common_NetCore(serviceProvider, url, out HttpContent hc, cookieContainer, postStream, fileDictionary, refererUrl, encoding, certName, useAjax, headerAddition, timeOut, checkValidationResult, contentType);
622+
HttpResponseMessage response;
626623

627-
var response = client.PostAsync(url, hc).ConfigureAwait(false).GetAwaiter().GetResult();//获取响应信息
624+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
625+
{
626+
try
627+
{
628+
response = client.PostAsync(url, hc, cancellationToken: cts.Token).ConfigureAwait(false).GetAwaiter().GetResult();//获取响应信息
629+
}
630+
catch { throw; }
631+
}
628632

629633
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
630634

@@ -916,10 +920,17 @@ public static async Task<SenparcHttpResponse> HttpResponsePostAsync(
916920
HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync().ConfigureAwait(false));
917921
return new SenparcHttpResponse(response);
918922
#else
919-
HttpContent hc;
920-
var client = HttpPost_Common_NetCore(serviceProvider, url, out hc, cookieContainer, postStream, fileDictionary, refererUrl, encoding, certName, useAjax, headerAddition, timeOut, checkValidationResult, contentType);
923+
var client = HttpPost_Common_NetCore(serviceProvider, url, out HttpContent hc, cookieContainer, postStream, fileDictionary, refererUrl, encoding, certName, useAjax, headerAddition, timeOut, checkValidationResult, contentType);
924+
HttpResponseMessage response;
921925

922-
var response = await client.PostAsync(url, hc).ConfigureAwait(false);//获取响应信息
926+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
927+
{
928+
try
929+
{
930+
response = await client.PostAsync(url, hc, cancellationToken: cts.Token).ConfigureAwait(false);//获取响应信息
931+
}
932+
catch { throw; }
933+
}
923934

924935
HttpClientHelper.SetResponseCookieContainer(cookieContainer, response);//设置 Cookie
925936

0 commit comments

Comments
 (0)