随笔背景:因为项目中有个简单的功能是需要实现中文简体到繁体的切换,数据库中存储的源数据都是中文简体的,为了省事就想着通过HttpHeader的方式来控制Api返回对应的繁体数据。

实现方式:通过Asp.Net Core 中的中间件来拦截HttpResponse,然后通过转换字符编码来实现中文繁体切换。

实现代码如下:

HttpContextMiddleware 中间件

  1. public class HttpContextMiddleware
  2. {
  3. private readonly RequestDelegate _next;
  4. public HttpContextMiddleware(RequestDelegate next)
  5. {
  6. _next = next;
  7. }
  8.  
  9. public async Task Invoke(HttpContext context)
  10. {
  11. var originalBodyStream = context.Response.Body;
  12.  
  13. using (var responseBody = new MemoryStream())
  14. {
  15. context.Response.Body = responseBody;
  16. await _next(context);
  17. var result = await FormatResponse(context.Response);
  18. if (context.Request.Headers.Keys.Contains(Constants.HttpHeaderLanguage))
  19. {
  20. var lang = context.Request.Headers.GetCommaSeparatedValues(Constants.HttpHeaderLanguage).GetValue().ToString();
  21. if (lang == "zh-tw")
  22. {
  23. var traditionresult = ConvertHelper.ToTraditional(result);
  24. byte[] array = Encoding.UTF8.GetBytes(traditionresult);
  25. MemoryStream stream = new MemoryStream(array);
  26. try
  27. {
  28. await stream.CopyToAsync(originalBodyStream);
  29. }
  30. catch (Exception ex)
  31. {
  32.  
  33. throw ex;
  34. }
  35. }
  36. else
  37. {
  38. try
  39. {
  40. await responseBody.CopyToAsync(originalBodyStream);
  41. }
  42. catch (Exception ex)
  43. {
  44.  
  45. throw ex;
  46. }
  47. }
  48. }
  49. else
  50. {
  51. await responseBody.CopyToAsync(originalBodyStream);
  52. }
  53.  
  54. }
  55. }
  56.  
  57. private async Task<string> FormatResponse(HttpResponse response)
  58. {
  59. response.Body.Seek(, SeekOrigin.Begin);
  60. var text = await new StreamReader(response.Body).ReadToEndAsync();
  61. response.Body.Seek(, SeekOrigin.Begin);
  62.  
  63. return $"{text}";
  64. }
  65. }

Startup.cs

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseDefaultFiles();
  4. app.UseAuthentication();
  5. app.UseStaticFiles();
  6. //在Mvc之前注入到管道中
  7. app.UseMiddleware<HttpContextMiddleware>();
  8. app.UseMvc();
  9. }

ConvertHelper 中文简体繁体转换工具类

  1. public static class ConvertHelper
  2. {
  3. private const int LOCALE_SYSTEM_DEFAULT = 0x0800;
  4. private const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
  5. private const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;
  6.  
  7. [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
  8. private static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);
  9.  
  10. /// <summary>
  11. /// 将字符转换成简体中文
  12. /// </summary>
  13. /// <param name="source">输入要转换的字符串</param>
  14. /// <returns>转换完成后的字符串</returns>
  15. public static string ToSimplified(string source)
  16. {
  17. String target = new String(' ', source.Length);
  18. int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, source, source.Length, target, source.Length);
  19. return target;
  20. }
  21.  
  22. /// <summary>
  23. /// 将字符转换为繁体中文
  24. /// </summary>
  25. /// <param name="source">输入要转换的字符串</param>
  26. /// <returns>转换完成后的字符串</returns>
  27. public static string ToTraditional(string source)
  28. {
  29. String target = new String(' ', source.Length);
  30. int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, source, source.Length, target, source.Length);
  31. return target;
  32. }
  33. }

以上源代码就是所有关键代码了,中间件注入以后,不用再在action里或controller里单独拦截,经测试,会拦截所有api的响应结果。这里有个插曲是我之前尝试过使用ResultFilter来拦截,但没法做到在响应后拦截响应结果。不知出于什么原因,最后我放弃了Filter的方式,选择了这种中间件的拦截方式。

本文参考如下:

https://elanderson.net/2017/02/log-requests-and-responses-in-asp-net-core/

本文如有不对的地方,欢迎指正!愿与君共勉。

最后,感谢您的阅读!

Asp.Net Core 2.0实现HttpResponse中繁切换的更多相关文章

  1. ASP.NET Core 2.0 Preview 1 中贴心的新特性

    西雅图时间5月10日,微软在 Build 2017 大会上发布了 ASP.NET Core 2.0 Preview 1 ( 详见 Announcing ASP.NET 2.0.0-Preview1 a ...

  2. 探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的应用中启动时运行异步任务

    前言:在本文中,我将介绍ASP.NET Core 3.0 WebHost的微小更改如何使使用IHostedService在应用程序启动时更轻松地运行异步任务. 翻译 :Andrew Lock   ht ...

  3. 在ASP.NET Core 2.0 web项目中使用EntityFrameworkCore

    一.安装EFCode包 EFCore需要根据不同的数据库选择不同的数据库提供程序database provider,各数据库的包地址:https://docs.microsoft.com/zh-cn/ ...

  4. ASP.NET Core 3.0 自动挡换手动挡:在 Middleware 中执行 Controller Action

    最近由于发现奇怪的 System.Data.SqlClient 性能问题(详见之前的博文),被迫提前了向 .NET Core 3.0 的升级工作(3.0 Preview 5 中问题已被修复).郁闷的是 ...

  5. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  6. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  7. 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

    原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...

  8. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  9. [译]ASP.NET Core 2.0 全局配置项

    问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...

随机推荐

  1. Django使用DjangoUeditor教程

    文章目录 1.将下在DjangoUeditor解压2.将解压的文件夹复制到项目的根目录中,这里使用的是虚拟环境3.进入到DjangoUedior3-master文件下,执行离线安装命令 python ...

  2. webservice入门程序学习中经验总结

    ***第一步:创建客户端服务 1)创建一个服务接口 2)创建一个实现类实现接口 3)创建一个方法开启服务 这三步注意点:::实现类上必须添加@WebService标签 :::发布服务的时候用到的函数是 ...

  3. WebFilter 在springBoot工程中不起作用

    [1]@ServletComponentScan 必须有一个注解将带有@WebFilter的类包含进去. [2]自定义 FiltersConfig extends WebMvcConfigurerAd ...

  4. SQL提高性能

    1.对外键建立索引,大数据量时性能提高明显(建索引可以直接[Merge Join],否则还须在查询时生成HASH表作[Hash Join]) 2.尽量少使用inner join,使用left join ...

  5. 千万不要在module里扩展较多逻辑,很容易引起项目异常。

    NOP项目 为保持紧跟NOP更新,项目组坚持不改NOP源码. 以触发器,插件化开发为拓展模式 NOP自定义好的接口或完全独立的新拓展功能很容易插件化. 但部分功能要在NOP原项目上扩展修改在不改源码的 ...

  6. 提升项目一:花卉管理系统(Servlet+JSP完成)

    这个是写的第一个项目:使用Servlet+JSP完成,加上对底层构架的理解,才可以对后面要接触使用的ssh框架的深刻理解 2017-02-11: 完成对进货业务的操作, 下一步完成对销货业务的操作

  7. basecalling|vector mark|Assembly的难题|

    生物信息学 染色体可以据染色图谱判断染色体号码,1-22号染色体依次变短,它们影响机体发育,23号染色体决定性别.肿瘤是由于遗传密码变异造成的.因此,遗传密码的解读非常重要,但是因为遗传密码长度非常长 ...

  8. oracle12c 可行的解决办法:ORA-01017: invalid username/password; logon denied

    开启服务OracleServiceORCL和OracleOraDB12Home1TNSListener用Oracle SQL developer 连接测试报错:ORA-01017: invalid u ...

  9. javascript学习内容

    http协议 犀牛书 MDN js单线程 let只在代码块内有效 es5只有全局作用域 const变量指向的内存地址不得改动,值不能保证不变 全局变量不加var node.js 更改连接到服务器的方式 ...

  10. module in JavaScript

    JavaScript 在ES6之前没有给出官方模块的定义,因此社区自己搞了两个模块加载方案: CommonJS (node) AMD (browser) 本文略 CommonJS规范 module定义 ...