Skip to content

Commit 8614cbc

Browse files
committed
Merge remote-tracking branch 'origin/Develop' into Develop_PUT_and_DELETE
2 parents 2abb946 + fdb0208 commit 8614cbc

File tree

3 files changed

+125
-72
lines changed

3 files changed

+125
-72
lines changed

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

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

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

222-
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
223-
using (var fs = File.Open(fullName, FileMode.Create))
224-
{
225-
using (var responseStream = responseMessage.Content.ReadAsStreamAsync().Result)
237+
}
238+
else
226239
{
227-
responseStream.CopyTo(fs);
228-
fs.Flush();
240+
return null;
229241
}
230242
}
231-
return fullName;
232-
233-
}
234-
else
235-
{
236-
return null;
237243
}
244+
catch { throw; }
238245
}
239246
#endif
240247
}
@@ -317,35 +324,44 @@ public static async Task<string> DownloadAsync(
317324
#else
318325
System.Net.Http.HttpClient httpClient = serviceProvider.GetRequiredService<SenparcHttpClient>().Client;
319326
#endif
320-
httpClient.Timeout = TimeSpan.FromMilliseconds(timeOut);
321-
using (var responseMessage = await httpClient.GetAsync(url).ConfigureAwait(false))
327+
//httpClient.Timeout = TimeSpan.FromMilliseconds(timeOut); // 此处建议不要直接修改httpClient的Timeout属性,因为这是该Client的全局共享值,会影响同Client实例下的其他请求超时时间
328+
// 微软技术文档原文链接【https://docs.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclient.timeout?f1url=%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(System.Net.Http.HttpClient.Timeout);k(DevLang-csharp)%26rd%3Dtrue&view=net-6.0】
329+
// 文档提到“使用此实例的所有请求都将使用相同的超时值 HttpClient 。 你还可以使用任务上的为单个请求设置不同的超时 CancellationTokenSource 。”
330+
using (var cts = new System.Threading.CancellationTokenSource(timeOut))
322331
{
323-
if (responseMessage.StatusCode == HttpStatusCode.OK)
332+
try
324333
{
325-
string responseFileName = null;
326-
//ContentDisposition可能会为Null
327-
if (responseMessage.Content.Headers.ContentDisposition != null &&
328-
responseMessage.Content.Headers.ContentDisposition.FileName != null &&
329-
responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
334+
using (var responseMessage = await httpClient.GetAsync(url, cancellationToken: cts.Token).ConfigureAwait(false))
330335
{
331-
responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
332-
}
333-
334-
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
335-
using (var fs = File.Open(fullName, FileMode.Create))
336-
{
337-
using (var responseStream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
336+
if (responseMessage.StatusCode == HttpStatusCode.OK)
338337
{
339-
await responseStream.CopyToAsync(fs).ConfigureAwait(false);
340-
await fs.FlushAsync().ConfigureAwait(false);
338+
string responseFileName = null;
339+
//ContentDisposition可能会为Null
340+
if (responseMessage.Content.Headers.ContentDisposition != null &&
341+
responseMessage.Content.Headers.ContentDisposition.FileName != null &&
342+
responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
343+
{
344+
responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
345+
}
346+
347+
var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
348+
using (var fs = File.Open(fullName, FileMode.Create))
349+
{
350+
using (var responseStream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
351+
{
352+
await responseStream.CopyToAsync(fs).ConfigureAwait(false);
353+
await fs.FlushAsync().ConfigureAwait(false);
354+
}
355+
}
356+
return fullName;
357+
}
358+
else
359+
{
360+
return null;
341361
}
342362
}
343-
return fullName;
344-
}
345-
else
346-
{
347-
return null;
348363
}
364+
catch { throw; }
349365
}
350366
}
351367
#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 NET451
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

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

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

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

0 commit comments

Comments
 (0)