整理:更新

main
wanggaofeng 1 year ago
parent 2127f13662
commit ed7a888078

@ -19,8 +19,4 @@
<ProjectReference Include="..\HttpClientStudy.Model\HttpClientStudy.Model.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="UsePolly\" />
</ItemGroup>
</Project>

@ -65,42 +65,4 @@ namespace HttpClientStudy.Core
return httpClient;
}
}
/// <summary>
/// 默认处理器1 - 添加自定义请求头
/// </summary>
public class CustomHeadersHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 在请求中添加自定义头部
request.Headers.Add("X-Custom-Header", "CustomValue");
// 调用管道中的下一个处理器
return await base.SendAsync(request, cancellationToken);
//响应信息(可不处理)
}
}
/// <summary>
/// 默认处理器1 - 简单的日志记录
/// </summary>
public class LoggingHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 记录请求信息
Console.WriteLine($"Request: {request.Method} {request.RequestUri}");
// 调用管道中的下一个处理器,并获取响应
var response = await base.SendAsync(request, cancellationToken);
// 记录响应信息
Console.WriteLine($"Response: {response.StatusCode}");
return response;
}
}
}

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.Core
{
/// <summary>
/// 默认处理器1 - 添加自定义请求头
/// </summary>
public class CustomHeadersHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 在请求中添加自定义头部
request.Headers.Add("X-Custom-Header", "CustomValue");
// 调用管道中的下一个处理器
return await base.SendAsync(request, cancellationToken);
//响应信息(可不处理)
}
}
}

@ -1,24 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.Core
{
public class HandlerB : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
InnerHandler = new SocketsHttpHandler() { };
//请求前业务
var response = await base.SendAsync(request, cancellationToken);
//响应后业务
return response;
}
}
}

@ -6,15 +6,21 @@ using System.Threading.Tasks;
namespace HttpClientStudy.Core
{
public class HandlerA : DelegatingHandler
/// <summary>
/// 默认处理器1 - 简单的日志记录
/// </summary>
public class LoggingHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//请求前业务
// 记录请求信息
Console.WriteLine($"Request: {request.Method} {request.RequestUri}");
// 调用管道中的下一个处理器,并获取响应
var response = await base.SendAsync(request, cancellationToken);
//响应后业务
// 记录响应信息
Console.WriteLine($"Response: {response.StatusCode}");
return response;
}

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.Core.UsePolly
{
/// <summary>
/// 使用Polly类库实现重试、熔断、限流等功能
/// </summary>
public class UsePolly
{
public void UsePollyDemo()
{
// TODO: 实现Polly的重试、熔断、限流功能
}
}
}

@ -45,9 +45,6 @@
<ItemGroup>
<Folder Include="HttpRequests\" />
<Folder Include="HttpResponses\" />
<Folder Include="UsePolly\" />
<Folder Include="UseJson\" />
</ItemGroup>
</Project>

@ -27,25 +27,6 @@ namespace HttpClientStudy.UnitTest.HttpClients
_logger = outputHelper;
}
/// <summary>
/// 多HttpClient实例问题
/// 1、HttpClient虽然继承了 IDisposable 接口但它是可以被共享的且线程安全。Using使用并不能立即释放
/// 2、网络特性虽然HttpClient客户端断开但Web服务并不知道连接依然存在状态为 “ TIME_WAIT”(继续等待看是否还有延迟的包会传输过来。)
/// Windows默认为 240s
/// 引发常见问题:
/// 1、HttpClient 多实例并存,有很大资源消耗;
/// 2、在高并发的情况下连接来不及释放 socket 被耗尽: 程序异常
/// 3、连带着会出现“各种套接字问题”
///
/// 查看问题:
/// 程序并发或多次请求后,通过 netstate 查看下 TCP 连接情况:有很多 TIME_WAIT 状态连接;很可能程序异常;
///
/// 解决:
/// 1、复用HttpClient
/// 2、HttpClientFactory
/// 3、解决DNS问题可以给HttpClient传参SocketsHttpHandler
/// </summary>
/// <returns></returns>
[Fact]
public async Task Multi_ClientObject_Test()
{

@ -22,10 +22,13 @@ namespace HttpClientStudy.UnitTest.HttpClients
public async Task Delegating_Test()
{
//构建管道
var handler = new HandlerA()
var handler = new CustomHeadersHandler()
{
//相当于下一个中间件(管道)
InnerHandler = new HandlerB()
InnerHandler = new SocketsHttpHandler()
{
AllowAutoRedirect = true
}
};
//构造中传入管道对象

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.UnitTest.HttpRequests
{
public class HttpRequestMethodsTest
{
public HttpRequestMethodsTest()
{
}
[Fact]
public void Test()
{
}
}
}

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.UnitTest.HttpResponses
{
public class HttpResponseContentTest
{
private readonly ITestOutputHelper _output;
public HttpResponseContentTest(ITestOutputHelper testOutput)
{
_output = testOutput;
}
[Fact]
public void Test()
{
}
}
}

@ -13,8 +13,10 @@ namespace HttpClientStudy.UnitTest
[Fact]
public void StartWebApiProject()
{
var startup = new Startup();
startup.StartWebApiProject();
string projectAndMutexName = WebApiConfigManager.GetWebApiConfigOption().CurrentValue.WebAppMutexName;
var mutex = new Mutex(true, projectAndMutexName, out bool createdResult);
Assert.False(createdResult);
}
}
}

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.UnitTest.UseJson
{
public class UseJsonInHttpTest
{
private readonly ITestOutputHelper _output;
public UseJsonInHttpTest(ITestOutputHelper testOutput)
{
_output = testOutput;
}
[Fact]
public void Test()
{
}
}
}

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace HttpClientStudy.UnitTest.UsePolly
{
public class UsePollyTest
{
private readonly ITestOutputHelper _output;
public UsePollyTest(ITestOutputHelper testOutput)
{
_output = testOutput;
}
[Fact]
public void Test()
{
}
}
}

@ -130,7 +130,7 @@ namespace HttpClientStudy.WebApp
//ÈÏÖ¤
builder.Services //ÈÏÖ¤»ù´¡¼Ü¹¹
.AddAuthentication(authOption =>
.AddAuthentication(authOption =>
{
authOption.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authOption.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;

Loading…
Cancel
Save