Abp vNext 动态API客户端
目的:解决客户端因需求的增多和不明确所造成的HhttpClient的复杂性;
过程:
1,客户端需要是模块化项目;
2,客户端系统引用HttpApi.Client;
3,在客户端中使用属性注入的方式,直接调用abp vNext中的相关服务;
原理:
1,abpvNext模块化思想;
2,HttpApi.Client仅依赖Application.Contracts,它是一个接口,它不能为直接使用;
3,上述第二点引出了代理类使用拦截,封装使用了HttpClient来进行请求
详细设置:
1,在客户端appsettings.json中设置上述拦截器的请求接口
"RemoteServices": { "YourAbpvNextProjectName:" { "BaseUrl" : "https://localhost:44389/" }}
2,HttpApi.Client使用Volo.Abp.Http.Client创建代理
HttpApi.Client项目Modul中,找到ConfigureServices方法,添加如下代码:
context.Services.AddHttpClientProxies(typeof(YourAbpvNextProjectNameApplicationContractsModul).Assembly, YourAbpvNextProjectName)
3,拦截器触发创建HttpClient,执行http请求
==>>> 按接口创建代理 、把代理类添加到IOC容器
3.1 通过程序集加载所有的接口;
3.2 for循环接口集合,使用Volo.Abp.Castle.Core模块创建代理;
3.3 DynamicHttpProxyInterceptor对象进行请求
使用polly实现失败重试
1,在HttpApi.Client项目中引入Nuget包:Microsoft.Extensions.Http.Polly
2,在HttpApi.Client启动模块中,重写 PreConfigureServices,设置相关信息
PreConfigure<AbpHttpClientBuilderOptions>(options =>
{
options.ProxyClientBuildActions.Add(remoteServiceName, clientBuilder) => {
clientBuilder.AddTransientHttpErrorPolicy(policyBuilder =>
policyBuilder.WaitAndRetryAsync(
3,
i => TimeSpan.FromSeconds(Math.Pow(2,i)) //等待两秒中重试,总重试3次
)
)
}
}
)