AspectCore 配合 Log4Net 全局记录Asp.Net Core Web Api异常日志

配置AspectCore-Framework 首先通过Nuget安装AspectCore.Extensions.DependencyInjection。 接下来我们可以配置拦截器: //继承自AbstractInterceptorAttribute public class CustomInterceptorAttribute : AbstractInterceptorAttribute { public override async Task Invoke(AspectContext context, AspectDelegate next) { try { Console.WriteLine("调用前"); await next(context);//执行调用的方法等 } catch (Exception ex) { Console.WriteLine("捕获到异常"); throw; } finally { Console.WriteLine("调用结束"); } } } 然后在Startup.cs中的ConfigureServices方法中配置代理 services.(config => { services.AddTransient<IExmapleService, ExmapleService>(); services.AddControllers(); config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForService("*Service")); config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForService("*Controller")); }); 以上配置是对名称以Service或Controller结尾的进行代理,还有其他一些规则如: //全部代理 config.Interceptors.AddTyped<CustomInterceptorAttribute>(); //名称以Execute开头的方法会被代理 config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForMethod("Execute*")); //以Service结尾则不会被代理 config.NonAspectPredicates.AddService("Service"); //更多详细规则可以查阅官方文档 //https://github.com/dotnetcore/AspectCore-Framework/blob/master/docs/1.%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md ...... 也可以通过NonAspectAttribute对Service或Method进行单独设置: //无论在Startup.cs中如何配置,该接口都不会通过代理 [NonAspect] public interface IExampleService { void Method(); } 最后在Program....

February 27, 2021 · 2 分钟 · Remo

使用AutoMapper自动映射

安装Nuget包 通过.Net CLI安装 dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection --version 8.1.0 该包会自动安装AutoMapper的依赖包。 配置AutoMapper 在Startup.cs的ConfigureServices方法中配置: services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //也可以如下指定项目: //services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.Location.Contains("ExampleSolution.Model"))); 接下来在ConfigureServices中添加: services.AddAutoMapperProfiles(Configuration); 然后为每个需要映射的类之间添加配置,如: public class ExmapleProfile : Profile { public ExmapleProfile() { //这里的映射方向是单向的,如不需要从ExmapleViewModel转Exmaple,则第二条就可以不用写 CreateMap<Exmaple, ExmapleViewModel>(); CreateMap<ExmapleViewModel, Exmaple>(); } } 使用 通过构造函数注入: private readonly IMapper _mapper; public ExmapleController(IMapper mapper) { _mapper = mapper; } 使用: public ActionResult ExmapleMethod() { ...... Exmaple entity = new Exmaple(); ExmapleViewModel entityVM = _mapper.Map<ExmapleViewModel>(entity); ...... }

January 15, 2021 · 1 分钟 · Remo

vuex-electron使用的小坑

最近使用的electron-vue框架中,自带了vuex-electron模块。本来照着vuex官方文档写的,结果发现this.$store.dispatch(‘example’)无效,根本无法调用成功。 经过反复被坑与Google+Baidu,终于发现vuex-electron这个模块引入了两个插件: plugins: [ createPersistedState(), createSharedMutations() ] 其中createSharedMutations这个插件用于进程间共享数据,因此还需要经过一点小小的调整。目前大概有两种方案: 1.推荐:在electron的主进程的index.js中引入store: import store from '../renderer/store' (以上import路径仅针对electron-vue的默认结构,具体路径请自行调整) 2.如果不需要共享数据,也可以放弃这个插件,在store/index.js中把createSharedMutations插件的引用给去掉即可。

November 9, 2020 · 1 分钟 · Remo

【转】10 分钟服务器安全设置,Ubuntu安全设置入门

英文:Cody Littlewood 译者:伯乐在线 – Panblack 链接:http://blog.jobbole.com/103344/ Bryan Kennedy 的《5分钟服务器安全设置》很好地介绍了对多数服务器攻击的防御对策。我们对他的方法做了一些修改,记录下来,作为推广我们的流程和最佳实践的一部分。还增加一些额外的解释,年轻的工程师们应该可以从中受益。 我每天上午检查 logwatch 邮件的时候,看到那些成百上千的登录尝试,几乎没有成功的,完全就像是一种享受。(有很多非常令人无语,比如用 1234 做 root 密码反反复复的登录)。这篇入门文章适用于 Debian/Ubuntu服务器,这是我们最喜欢的服务器发行版,通常我们这些服务器只是作为 docker 容器的宿主机,不过原理仍然适用。下一次我们再深入讲解如何保护专门用作 docker 宿主机的服务器。 在大规模系统上,当然最好是用 Ansible 或 Shipyard 这类工具完全自动化配置。不过偶尔的,你只是搭建一台独立服务器或为一个 Ansible recipe 准备基准设置,这就是本文要涵盖的内容。 声明:本文仅仅是入门和基础,你需要根据自己的需求来扩展。 重要的事先说 我们还没给 root 设密码呢,密码要随机、要复杂。我们用一种密码管理软件的密码生成器,调至最复杂设定。PW 管理软件将密码加密保存,并且由一个很长的主密码保护着。这里提供了多项冗余措施——长、复杂、随机的密码 + 加密保存/另一个长密码保护。不管你是用 PW 管理软件或其他手段,要妥善保管密码并且要加密保存。你只有在忘了 sudo 密码时才会用到这个密码。 # passwd * 注:在 HN 和 Redit 上有很多关于 root 密码的讨论,值得一读。 下一步就需要更新软件库并升级系统、应用最新的补丁。我们后面有个章节专门介绍如何自动安装安全更新。 apt–get update apt–get upgrade 添加用户 永远不要以 root 登录服务器。在用户名方面我们跟 Bryan 遵循类似的惯例,但是你可以根据自己的喜好使用任何惯例。在小团队里,大家共用一个用户名不是问题;但是队伍再大一些的话,最好是给不同的用户设定不同的权限级别,只给精心挑选的少数用户赋予 sudo 权限。...

May 21, 2020 · 3 分钟 · Remo

C#中的 explicit 和 implicit 关键字

简单记录一下。 explicit explicit 用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 例如如下类型: public class StringCombine { private readonly string _firstString; private readonly string _secondString; public StringCombine(string firstString, string secondString) { this._firstString = firstString; this._secondString = secondString; } public string Combine() { return $"{_firstString} {_secondString}"; } } 可以看到StringCombine类中有一个Combine()方法,用于将该类中的两个私有成有组合后输出: StringCombine stringCombine = new StringCombine("Hello", "world!"); string newString = stringCombine.Combine(); Console.WriteLine(newString); 如上代码将会输出Hello world!。 现在我们在StringCombine类中添加一段代码: public static explicit operator string(StringCombine stringCombine) { return stringCombine.Combine(); } 这时我们稍稍修改一下上面的代码: StringCombine stringCombine = new StringCombine("Hello", "world!...

January 21, 2020 · 1 分钟 · Remo