1 WebApiClient

一款基于HttpClient封装,只需要定义c#接口并修饰相关特性,即可异步调用远程http接口的客户端库

2 Http接口的注册与提供

2.1 声明远程端http接口

public interface IBaiduApi : IHttpApi
{
[HttpGet("/s")]
ITask<string> GetAsync(string word);
}

2.2 远程端http的注册

使用HttpClientFactory管理HttpClient的创建,利用AddTypedClient创建远程http接口的WebApiClient调用代理,同时给HttpApiConfig配置ServiceProvider实例。

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpApiTypedClient<IBaiduApi>().ConfigureHttpApiConfig((c, p) =>
{
c.HttpHost = new Uri("http://www.baidu.com/");
});
}
/// <summary>
/// 添加HttpApiClient的别名HttpClient
/// </summary>
/// <typeparam name="TInterface">接口类型</typeparam>
/// <param name="services"></param>
/// <param name="configOptions">配置选项</param>
/// <exception cref="ArgumentNullException"></exception>
/// <returns></returns>
public static IHttpClientBuilder AddHttpApiTypedClient<TInterface>(this IServiceCollection services, Action<HttpApiConfig, IServiceProvider> configOptions)
where TInterface : class, IHttpApi
{
if (configOptions == null)
{
throw new ArgumentNullException(nameof(configOptions));
} return services
.AddHttpClient<TInterface>()
.AddTypedClient((httpClient, provider) =>
{
var httpApiConfig = new HttpApiConfig(httpClient)
{
ServiceProvider = provider
};
configOptions.Invoke(httpApiConfig, provider);
return HttpApiClient.Create<TInterface>(httpApiConfig);
});
}

2.3 远程端http接口的提供

可以使用构造器注入IBaiduApi或[FromServices]特性得到远程接口代理实例。

public class HomeController : Controller
{
// GET: /<controller>/
public async Task<IActionResult> Index([FromServices] IBaiduApi baiduApi)
{
var html = await baiduApi.GetAsync("WebApiClient");
return Content(html);
}
}

3 WebApiClient过滤器的服务提供

3.1 在接口上使用自定义LogFilter

[LogFilter]
public interface IBaiduApi : IHttpApi
{
[HttpGet("/s")]
ITask<string> GetAsync(string word);
}

3.2 使用context.GetService获取服务实例

class LogFilter : ApiActionFilterAttribute
{
public override Task OnBeginRequestAsync(ApiActionContext context)
{
var logger = context.GetService<ILoggerFactory>().CreateLogger("Baidu");
logger.LogWarning($"request {context.ApiActionDescriptor.Name} {context.RequestMessage.RequestUri}"); return base.OnBeginRequestAsync(context);
}
}

3.3 日志服务输出日志样例

warn: Baidu[0]
request GetAsync http://www.baidu.com/s?word=WebApiClient

WebApiClient与Asp.net core DI的结合的更多相关文章

  1. ASP.NET Core DI 手动获取注入对象

    ASP.NET Core DI 一般使用构造函数注入获取对象,比如在ConfigureServices配置注入后,通过下面方式获取: private IValueService _valueServi ...

  2. ASP.NET Core DI概述

    众所周知,ASP.NET Core有一个DI框架,应用程序启动时初始化. 预定义依赖 1: IApplicationBuilder:提供了配置应用程序的请求管道机制 2:ILoggerFactory: ...

  3. DI in ASP.NET Core

    .NET-Core Series Server in ASP.NET-Core DI in ASP.NET-Core Routing in ASP.NET-Core Error Handling in ...

  4. 用Scrutor来简化ASP.NET Core的DI注册

    目录 背景 Scrutor简介 Scrutor的简单使用 注册接口的实现类 注册类自身 重复注册处理策略 总结 相关文章 背景 在我们编写ASP.NET Core代码的时候,总是离不开依赖注入这东西. ...

  5. 声明式RESTful客户端在asp.net core中的应用

    1 声明式RESTful客户端 声明式服务调用的客户端,常见有安卓的Retrofit.SpringCloud的Feign等,.net有Refit和WebApiClient,这些客户端都是以java或. ...

  6. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组

    Sorting, filtering, paging, and grouping 7 of 8 people found this helpful By Tom Dykstra The Contoso ...

  7. 如何一秒钟从头构建一个 ASP.NET Core 中间件

    前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...

  8. ASP.NET Core MVC 源码学习:Routing 路由

    前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...

  9. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

随机推荐

  1. 【prufer编码】BZOJ1430 小猴打架

    Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森 ...

  2. BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP

    BZOJ_2427_[HAOI2010]软件安装_tarjan+树形DP 题意: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁 ...

  3. SA SD SE 区别

    [SA(System Analysis)系统分析师] 通过一系列分析手法把User想要的结果,以各种文件方式表达出来. 此过程着重于工作流程和处理逻辑. 规划系统功能和模块. 定出初步的数据库内容及系 ...

  4. Postman----基础使用篇(没有接口文档的情况下如何着手做接口测试)

    [备注说明]内文中的图片由于页面的限制,图片显示不清晰,为了能更加的看清图片,请点击"图片",点击"右键"选择"在新标签页中打开图片",可查 ...

  5. Https协议与HttpClient的实现

    一.背景 HTTP是一个传输内容有可读性的公开协议,客户端与服务器端的数据完全通过明文传输.在这个背景之下,整个依赖于Http协议的互联网数据都是透明的,这带来了很大的数据安全隐患.想要解决这个问题有 ...

  6. Error Code: 1044. Access denied for user 'root'@'%' to database

    mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user; +--------------+--------- ...

  7. .net core 注入中的三种模式:Singleton、Scoped 和 Transient

    从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...

  8. React + TypeScript:元素引用的传递

    React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...

  9. [Linux] host dig nslookup查询域名的DNS解析

    root@VM-38-204-ubuntu:~# host baidu.com baidu.com has address 220.181.57.216 baidu.com has address 1 ...

  10. Java 在PDF 中添加超链接

    对特定元素添加超链接后,用户可以通过点击被链接的元素来激活这些链接,通常在被链接的元素下带有下划线或者以不同的颜色显示来进行区分.按照使用对象的不同,链接又可以分为:文本超链接,图像超链接,E-mai ...