当前有这样一个场景,需要对外提供接口,而这个接口里面可以不写做具体的逻辑,转手调用别的接口,并将请求该接口的 Headers 与数据一起转发,流程如图:

如图所示 API Service 接收统一接收请求,但并不处理请求,仅仅只做转发。最终处理请求的是 Other Service。接下来是通过 WebApiClient 快速定义转发接口:

namespace ARchGL.Platform.UserRequest
{
#if DEBUG[Timeout(3000)]
#else[Timeout(10000)]
#endif[TraceFilter(OutputTarget = OutputTarget.Console)]public interface IForwardInfoApi : IHttpApi{/// <summary>/// 上传环境监测工作数据/// </summary>/// <param name="input"></param>/// <returns></returns>[HttpPost("/api/open/iot/v3/env/runtime")]Task<AjaxResponse<string>> UpdateEnvironment([JsonContent]ForwardInput input);}
}

接口定义后用起来就和我们自己写的业务逻辑差不多,在需用用到的地方注入即可。下面我们就将这个接口提供给外部调用。

public class ForwardAppService : PlatformAppServiceBase
{private readonly IForwardInfoApi _forwardInfoApi;public JianweiAppService(IHostingEnvironment env, IForwardInfoApi forwardInfoApi){_forwardInfoApi = forwardInfoApi;}/// <summary>创建项目人员信息</summary>[DontWrapResult]public async Task<object> UpdateEnvironment(ForwardInput input){return await _forwardInfoApi.UpdateEnvironment(input);}
}

至此,我们就将 UpdateEnvironment 接口提供给外部调用了,并且将接口返回信息原封不动的返回给调用方,对于用户来说甚至感受不到接口变化,和直接调用 Other Service 是”一样的“。

注意 UpdateEnvironment 方法使用了  [DontWrapResult] 注解,前面有一篇文章对于用法有提到,点我去了解。

public class ThirdPartyChongqingHttpRegistrarHeaderAttribute : ApiActionFilterAttribute
{private readonly IConfigurationRoot _appConfiguration;public ThirdPartyChongqingHttpRegistrarHeaderAttribute(IConfigurationRoot appConfiguration){_appConfiguration = appConfiguration;}public override async Task OnBeginRequestAsync(ApiActionContext context){//从请求中获取 Header 并注入 WebApiClient Header 中传递var request = context.GetService<IHttpContextAccessor>().HttpContext.Request;if (request != null){var headers = request.Headers;if (headers != null){var keyId = headers["keyId"].FirstOrDefault();var code = headers["rCode"].FirstOrDefault();context.RequestMessage.Headers.Add("keyId", keyId);context.RequestMessage.Headers.Add("ts", headers["ts"].FirstOrDefault());context.RequestMessage.Headers.Add("rCode", code);context.RequestMessage.Headers.Add("signature", headers["signature"].FirstOrDefault());}}await base.OnBeginRequestAsync(context);}

上面是最终的代码,这里稍微讲下遇到的问题。主要是如何在 OnBeginRequestAsync 中如何实例化的问题。在老版本 ABP 中可以使用 IoCManager 类实例化。在 Volo 中改为 GetService 方式。在任何地方,只要有 GetService 方法就能注入。代码如下:

context.GetService<IHttpContextAccessor>().HttpContext.Request;

通过 GetService 注入 IHttpContextAccessor 就可以取到 Request ,接下来取 Headers 的事情就顺理成章了。另外主张对外接口与业务分离开来这样可以最大限度减少对外接口的变动。

Volo.Abp 整合 WebApiClient 从请求中获取 Headers 信息相关推荐

  1. 从HTTP请求中获取客户IP地址

    /*** 从HTTP请求中获取客户IP地址** @param request http请求* @return 客户IP地址*/public static String getIPAddress( Ht ...

  2. java如何取到配置文件中值,从配置文件中获取配置信息的几种方法

    1.利用ResourceBundle类从properties文件中获取配置信息 创建配置文件并写入配置信息 image.png 使用以下代码可以轻松获取配置信息 package com.course. ...

  3. PowerShell_零基础自学课程_6_PS中获取帮助信息详解、管道、格式化输

    前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-comm ...

  4. PowerShell_6_零基础自学课程__6_PS中获取帮助信息详解、管道、格式化输

    前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-comm ...

  5. AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址)

    原文链接:AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址) 好久没来这里了,最近发现网络上对此类信息的封装少的可怜,没有一个是比较完整的,今天又是周未,不敲点代码手痒 ...

  6. Android中获取屏幕信息的几种方式

    Android中获取屏幕信息的几种方式 方案一 方案二 方案三 Note:以下方案中的this均指Activity. 方案一 WindowManager wm = (WindowManager) th ...

  7. excel从身份证号码中获取邮编信息?

    今天跟大家分享一下excel从身份证号码中获取邮编信息? 1.打开excel身份证号码文件,现在要求我们快速根据身份证号码提取邮编信息. 2.首先我们选中身份证号码单元格,点击[DIY工具箱]选项卡 ...

  8. c linux 获取cpuid_[C] 在GCC中获取CPUID信息(兼容VC)

    前面我们尝试过在VC中获取CPUID信息.现在再来试试GCC编译器. 一.调用CPUID指令 怎么调用CPUID指令呢?有三种办法-- 1. 用汇编语言编写一个cpuid函数,然后调整链接器配置,在C ...

  9. [C] 在GCC中获取CPUID信息(兼容VC)

    作者:zyl910 前面我们尝试过在VC中获取CPUID信息.现在再来试试GCC编译器. 一.调用CPUID指令 怎么调用CPUID指令呢?有三种办法-- 1. 用汇编语言编写一个cpuid函数,然后 ...

最新文章

  1. 通过OKR复盘会议你会学到哪些?
  2. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第14章-带通信和输入时延的异构竞争多智能体系统分组一致性
  3. 测试 MySQL 性能的几款工具
  4. combobox 怎么实现对listview的类别查询_Flutter实战之独立实现官网Demo单词收藏Demo
  5. [python爬虫] 招聘信息定时系统 (二).调用pyinstaller包生成exe文件
  6. linux 搜索 文件 内容,Linux 文件查找及文件内容查找
  7. 晕了!这个配置值从哪来的?
  8. 19.jsp生命周期
  9. IOS 设置文件是否使用ARC
  10. sdn的用处_SDN原来如此简单?三分钟轻松掌握!
  11. 【对比Java学Kotlin】协程-异步流
  12. unity打包VR项目注意事项
  13. 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
  14. 15、 Flutter Widgets 之 ClipRect,ClipRRect,ClipOval,ClipPath,CustomClipper,裁剪组件
  15. 创 nginx v1.4.6 部署ThinkPHP 页面访问404 -- 酱油小君搬砖记
  16. 血缘服务器维护,维护家庭和睦的几个关键
  17. git reset 怎么还原_git reset –hard误操作,如何恢复数据
  18. 判断一个数是不是素数
  19. 为什么我们一直深入底层
  20. 【C++】之 iota() 函数与 atoi() 函数详解

热门文章

  1. DevOps系列之 —— 持续规划与设计(四)敏捷需求管理【用户故事 敏捷估算】
  2. 随机信号分析第2版[赵淑清郑薇编著](课后作业答案自己写的,第一二三四章全部,第五章2345题)
  3. 安装SAS增强型编辑器资源和步骤
  4. 移动 APP 端与服务器端用户身份认证的安全方案
  5. FPGA数字信号处理(十六)单级CIC滤波器Verilog设计
  6. 为什么学微电子的都怕掉进材料的坑?
  7. 【分享】AlienWareM15R6键盘失灵
  8. EditPlus 格式化 Unicode,编辑properties
  9. MogaFX —北美和大洋洲的汇率
  10. Linux - dsta 命令详解