Asp.Net Core 2.0实现HttpResponse中繁切换
随笔背景:因为项目中有个简单的功能是需要实现中文简体到繁体的切换,数据库中存储的源数据都是中文简体的,为了省事就想着通过HttpHeader的方式来控制Api返回对应的繁体数据。
实现方式:通过Asp.Net Core 中的中间件来拦截HttpResponse,然后通过转换字符编码来实现中文繁体切换。
实现代码如下:
HttpContextMiddleware 中间件
- public class HttpContextMiddleware
- {
- private readonly RequestDelegate _next;
- public HttpContextMiddleware(RequestDelegate next)
- {
- _next = next;
- }
- public async Task Invoke(HttpContext context)
- {
- var originalBodyStream = context.Response.Body;
- using (var responseBody = new MemoryStream())
- {
- context.Response.Body = responseBody;
- await _next(context);
- var result = await FormatResponse(context.Response);
- if (context.Request.Headers.Keys.Contains(Constants.HttpHeaderLanguage))
- {
- var lang = context.Request.Headers.GetCommaSeparatedValues(Constants.HttpHeaderLanguage).GetValue().ToString();
- if (lang == "zh-tw")
- {
- var traditionresult = ConvertHelper.ToTraditional(result);
- byte[] array = Encoding.UTF8.GetBytes(traditionresult);
- MemoryStream stream = new MemoryStream(array);
- try
- {
- await stream.CopyToAsync(originalBodyStream);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- else
- {
- try
- {
- await responseBody.CopyToAsync(originalBodyStream);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
- else
- {
- await responseBody.CopyToAsync(originalBodyStream);
- }
- }
- }
- private async Task<string> FormatResponse(HttpResponse response)
- {
- response.Body.Seek(, SeekOrigin.Begin);
- var text = await new StreamReader(response.Body).ReadToEndAsync();
- response.Body.Seek(, SeekOrigin.Begin);
- return $"{text}";
- }
- }
Startup.cs
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- app.UseDefaultFiles();
- app.UseAuthentication();
- app.UseStaticFiles();
- //在Mvc之前注入到管道中
- app.UseMiddleware<HttpContextMiddleware>();
- app.UseMvc();
- }
ConvertHelper 中文简体繁体转换工具类
- public static class ConvertHelper
- {
- private const int LOCALE_SYSTEM_DEFAULT = 0x0800;
- private const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
- private const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;
- [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
- private static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);
- /// <summary>
- /// 将字符转换成简体中文
- /// </summary>
- /// <param name="source">输入要转换的字符串</param>
- /// <returns>转换完成后的字符串</returns>
- public static string ToSimplified(string source)
- {
- String target = new String(' ', source.Length);
- int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, source, source.Length, target, source.Length);
- return target;
- }
- /// <summary>
- /// 将字符转换为繁体中文
- /// </summary>
- /// <param name="source">输入要转换的字符串</param>
- /// <returns>转换完成后的字符串</returns>
- public static string ToTraditional(string source)
- {
- String target = new String(' ', source.Length);
- int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, source, source.Length, target, source.Length);
- return target;
- }
- }
以上源代码就是所有关键代码了,中间件注入以后,不用再在action里或controller里单独拦截,经测试,会拦截所有api的响应结果。这里有个插曲是我之前尝试过使用ResultFilter来拦截,但没法做到在响应后拦截响应结果。不知出于什么原因,最后我放弃了Filter的方式,选择了这种中间件的拦截方式。
本文参考如下:
https://elanderson.net/2017/02/log-requests-and-responses-in-asp-net-core/
本文如有不对的地方,欢迎指正!愿与君共勉。
最后,感谢您的阅读!
Asp.Net Core 2.0实现HttpResponse中繁切换的更多相关文章
- 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 ...
- 探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的应用中启动时运行异步任务
前言:在本文中,我将介绍ASP.NET Core 3.0 WebHost的微小更改如何使使用IHostedService在应用程序启动时更轻松地运行异步任务. 翻译 :Andrew Lock ht ...
- 在ASP.NET Core 2.0 web项目中使用EntityFrameworkCore
一.安装EFCode包 EFCore需要根据不同的数据库选择不同的数据库提供程序database provider,各数据库的包地址:https://docs.microsoft.com/zh-cn/ ...
- ASP.NET Core 3.0 自动挡换手动挡:在 Middleware 中执行 Controller Action
最近由于发现奇怪的 System.Data.SqlClient 性能问题(详见之前的博文),被迫提前了向 .NET Core 3.0 的升级工作(3.0 Preview 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是否配置错误. 具体而言,该功能可检 ...
- 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...
- 探索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包含比以前版本更多的现成模板. 在本文中,我将 ...
- ASP.NET Core 1.0 开发记录
官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...
- [译]ASP.NET Core 2.0 全局配置项
问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...
随机推荐
- Django使用DjangoUeditor教程
文章目录 1.将下在DjangoUeditor解压2.将解压的文件夹复制到项目的根目录中,这里使用的是虚拟环境3.进入到DjangoUedior3-master文件下,执行离线安装命令 python ...
- webservice入门程序学习中经验总结
***第一步:创建客户端服务 1)创建一个服务接口 2)创建一个实现类实现接口 3)创建一个方法开启服务 这三步注意点:::实现类上必须添加@WebService标签 :::发布服务的时候用到的函数是 ...
- WebFilter 在springBoot工程中不起作用
[1]@ServletComponentScan 必须有一个注解将带有@WebFilter的类包含进去. [2]自定义 FiltersConfig extends WebMvcConfigurerAd ...
- SQL提高性能
1.对外键建立索引,大数据量时性能提高明显(建索引可以直接[Merge Join],否则还须在查询时生成HASH表作[Hash Join]) 2.尽量少使用inner join,使用left join ...
- 千万不要在module里扩展较多逻辑,很容易引起项目异常。
NOP项目 为保持紧跟NOP更新,项目组坚持不改NOP源码. 以触发器,插件化开发为拓展模式 NOP自定义好的接口或完全独立的新拓展功能很容易插件化. 但部分功能要在NOP原项目上扩展修改在不改源码的 ...
- 提升项目一:花卉管理系统(Servlet+JSP完成)
这个是写的第一个项目:使用Servlet+JSP完成,加上对底层构架的理解,才可以对后面要接触使用的ssh框架的深刻理解 2017-02-11: 完成对进货业务的操作, 下一步完成对销货业务的操作
- basecalling|vector mark|Assembly的难题|
生物信息学 染色体可以据染色图谱判断染色体号码,1-22号染色体依次变短,它们影响机体发育,23号染色体决定性别.肿瘤是由于遗传密码变异造成的.因此,遗传密码的解读非常重要,但是因为遗传密码长度非常长 ...
- oracle12c 可行的解决办法:ORA-01017: invalid username/password; logon denied
开启服务OracleServiceORCL和OracleOraDB12Home1TNSListener用Oracle SQL developer 连接测试报错:ORA-01017: invalid u ...
- javascript学习内容
http协议 犀牛书 MDN js单线程 let只在代码块内有效 es5只有全局作用域 const变量指向的内存地址不得改动,值不能保证不变 全局变量不加var node.js 更改连接到服务器的方式 ...
- module in JavaScript
JavaScript 在ES6之前没有给出官方模块的定义,因此社区自己搞了两个模块加载方案: CommonJS (node) AMD (browser) 本文略 CommonJS规范 module定义 ...