首页 文章 精选 留言 我的

精选列表

搜索[asp.net],共1117篇文章
优秀的个人博客,低调大师

2.5配置的框架浅析「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。 配置的使用流程 //第一步.初始化Builder var builder = new ConfigurationBuilder(); //第二步.将Source添加到Builder builder.AddJsonFile("student.json", false, true); //builder.AddInMemoryCollection(dict) //builder.AddXmlFile("/path/tmp.xml") //第三步.调用Build var configuration = builder.Build(); //第四步.使用 configurationRoot["key"] 第二步,在将Source添加到Builder的时候,内部做了哪些事情呢? 初始化对应的Source对象,比如Json文件配置源对象: JsonConfigurationSource sr=new JsonConfigurationSource() { Path = "settings.json", } 第三步,Build时候在内部,生成Provider对象,一个Source对应一个Provider,最后返回ConfigurationRoot,该Root包含所有的Provider。 foreach(var source in sources) { var provider = source.Build(); providers.add(provider); } return new ConfigurationRoot(providers); 第四步,在使用的时候,通过Provider去找到相应的key,返回key值。 foreach(var provider in providers.Reverse()) { string value; provider.TryGet(key,out value); return value; } 通过以上步骤,我们可以看到配置Source和配置Provider是关键的两个要点。 内部类关系图 如果所示,如果要自己定义配置,必须实现接口IConfigurationSource,并在内部实现一个对应的Provider,该Provider必须继承ConfigurationProvider抽象类,并在Provider读取配置,对配置进行维护、同步、热更新。具体如何定制,在后续进阶和高级进行讲解。 我是.NET架构师张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注我的头条号。

优秀的个人博客,低调大师

(9)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- JWT算法

一、 JWT 简介 内部 Restful 接口可以“我家大门常打开”,但是如果要给 app 等使用的接口,则需要做权限校验,不能谁都随便调用。 Restful 接口不是 web 网站,App 中很难直接处理 SessionId,而且 Cookie 有跨域访问的限制,所以一般不能直接用后端 Web 框架内置的 Session 机制。但是可以用类似 Session 的机制,用户登录之后返回一个类似 SessionId 的东西,服务器端把 SessionId 和用户的信息对应关系保存到 Redis 等地方,客户端把 SessionId 保存起来,以后每次请求的时候都带着这个SessionId。 用类似 Session 这种机制的坏处:需要集中的 Session 机制服务器;不可以在 nginx、CDN 等静态文件处理服务器上校验权限;每次都要根据 SessionId 去 Redis 服务器获取用户信息,效率低; JWT(Json Web Token)是现在流行的一种对 Restful 接口进行验证的机制的基础。 JWT 的特点:把用户信息放到一个 JWT 字符串中,用户信息部分是明文的,再加上一部分签名区域,签名部分是服务器对于“明文部分+秘钥”加密的,这个加密信息只有服务器端才能解析。用户端只是存储、转发这个 JWT 字符串。如果客户端篡改了明文部分,那么服务器端解密时候会报错。 JWT 由三块组成,可以把用户名、用户 Id 等保存到 Payload 部分 注意 Payload和 Header部分都是 Base64编码,可以轻松的 Base64解码回来。因此 Payload 部分约等于是明文的,因此不能在 Payload 中保存不能让别人看到的机密信息。虽然说 Payload 部分约等于是明文的,但是不用担心 Payload 被篡改,因为 Signature 部分是根据 header+payload+secretKey 进行加密算出来的,如果 Payload 被篡改,就可以根据 Signature 解密时候校验。 用 JWT 做权限验证的好处:无状态,更有利于分布式系统,不需要集中的 Session 机制服务器;可以在 nginx、CDN 等静态文件处理服务器上校验权限;获取用户信息直接从 JWT 中就可以读取,效率高; 二、.Net 中使用 JWT 算法 1) 加密 Nuget -> Install-Package JWT var payload = new Dictionary<string, object> { { "UserId", 123 }, { "UserName", "admin" } }; var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";//不要泄露 IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new JsonNetSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder); var token = encoder.Encode(payload, secret); Console.WriteLine(token); 2) 解密 var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qj w1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U"; var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; try { IJsonSerializer serializer = new JsonNetSerializer(); IDateTimeProvider provider = new UtcDateTimeProvider(); IJwtValidator validator = new JwtValidator(serializer, provider); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); var json = decoder.Decode(token, secret, verify: true); Console.WriteLine(json); } catch (FormatException) { Console.WriteLine("Token format invalid"); } catch (TokenExpiredException) { Console.WriteLine("Token has expired"); } catch (SignatureVerificationException) { Console.WriteLine("Token has invalid signature"); } 试着篡改一下 Payload 部分。 3) 过期时间 在 payload 中增加一个名字为 exp 的值,值为过期时间和 1970/1/1 00:00:00 相差的秒数 double exp = (DateTime.UtcNow.AddSeconds(10) - new DateTime(1970, 1, 1)).TotalSeconds; 4) 不用秘钥解析数据payload 因为 payload 部分是明文的,所以在不知道秘钥的时候也可以用 Decode、DecodeToObject 等不需要秘钥的方法把payload部分解析出来。 var token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qjw1 epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U"; try { IJsonSerializer serializer = new JsonNetSerializer(); IDateTimeProvider provider = new UtcDateTimeProvider(); IJwtValidator validator = new JwtValidator(serializer, provider); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); var json = decoder.Decode(token); Console.WriteLine(json); } catch (FormatException) { Console.WriteLine("Token format invalid"); } catch (TokenExpiredException) { Console.WriteLine("Token has expired"); } 现在的努力只是为了更好的将来,将来你一定不会后悔你现在的努力。一起加油吧!!! C#/.NetCore技术交流群:608188505欢迎加群交流 如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

优秀的个人博客,低调大师

(6)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- AOP框架

AOP 框架基础 要求懂的知识:AOP、Filter、反射(Attribute)。 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码。我们使用 AOP (如果不了解 AOP,请自行参考网上资料)的方式封装一个简单的框架,模仿 Spring cloud 中的 Hystrix。 需要先引入一个支持.Net Core 的 AOP,我们用.Net Core 下的 AOP 框架是AspectCore(国产,动态织入),其他要不就是不支持.Net Core,要不就是不支持对异步方法进行拦截 MVC Filter。 GitHub:https://github.com/dotnetcore/AspectCore-Framework Install-Package AspectCore.Core -Version 0.5.0 这里只介绍和我们相关的用法: 1、编写拦截器CustomInterceptorAttribute 一般继承自AbstractInterceptorAttribute public class CustomInterceptorAttribute:AbstractInterceptorAttribute { //每个被拦截的方法中执行 public async override Task Invoke(AspectContext context, AspectDelegate next) { try { Console.WriteLine("执行之前"); await next(context);//执行被拦截的方法 } catch (Exception) { Console.WriteLine("被拦截的方法出现异常"); throw; } finally { Console.WriteLine("执行之后"); } } } 2、编写需要被代理拦截的类 在要被拦截的方法上标注CustomInterceptorAttribute 。类需要是public类,方法如果需要拦截就是虚方法,支持异步方法,因为动态代理是动态生成被代理的类的动态子类实现的。 public class Person { [CustomInterceptor] public virtual void Say(string msg) { Console.WriteLine("service calling..."+msg); } } 3、通过AspectCore创建代理对象 ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder(); using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build()) { Person p = proxyGenerator.CreateClassProxy<Person>(); p.Say("rupeng.com"); } Console.ReadKey(); 注意p指向的对象是AspectCore生成的Person的动态子类的对象,直接new Person是无法被拦截的。 研究AOP细节 拦截器中Invoke方法下的参数AspectContext的属性的含义: Implementation 实际动态创建的Person子类的对象。 ImplementationMethod就是Person子类的Say方法 Parameters 方法的参数值。 Proxy==Implementation:当前场景下 ProxyMethod==ImplementationMethod:当前场景下 ReturnValue返回值 ServiceMethod是Person的Say方法 注:此文章是我看杨中科老师的.Net Core微服务第二版和.Net Core微服务第二版课件整理出来的 现在的努力只是为了更好的将来,将来你一定不会后悔你现在的努力。一起加油吧!!! C#/.NetCore技术交流群:608188505欢迎加群交流 如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

优秀的个人博客,低调大师

《Pro ASP.NET MVC 3 Framework》学习笔记之十九【URL和Routing】

创建传出的URL(Outgoing URLs) 处理传入的URL(Incoming URLs)仅仅是路由系统的一部分功能。我们也需要使用URL架构来创建Outgoing URLs,我们可以将这些URL嵌入到我们的View里面,并且能够让用户点击URL提交表单给我们的应用程序,并能够命中合适的controller和action。 下面会展示用不同的技术来创建Outgoing URLs: 最便捷的创建Outgoing URLs就是手动定义如:<a href="/Home/About">About this application</a> 这样的URL。这个URL会命中HomeController中的About action方法。手动定义Outgoing URLs的确非常便捷,但是这样做也是非常危险的,因为一旦你改变了自己应用程序的URL架构,你就打破了所有手动创建的Outgoing URLs。你必须排查修改所有的View里面的Outgoing URLs,并更新所有的Controller和Action中对这些URL的引用。 Routing System能够从URL架构创建URL,因此如果URL架构发生了变化,那么由此创建在View里面的Outgoing URLs也会随之发生改变。显然这种方式才是明智之举,但也需要我们在前期做一些初始化的工作,这是非常值得的,长远来看这会让我们获益匪浅。 下面会通过实例来说明,仍然借用前面的项目, 只不过做些修改:1)移除AdditionalControllers 2)修改RegisterRoutes如下: View Code 最简便的在View里面创建一个Outgoing URL就是调用Html.ActionLink方法。如:@Html.ActionLink("关于", "About").该方法是根据当前的URL架构创建URL的,查看页面的源文件可以发现该URL为<a href="/Home/About">关于</a>。假设我们改变URL架构如下: View Code 我们会得到这样的一个URL:<a href="/App/DoAbout">关于</a> 理解输出的URL路由匹配 通过上面的介绍,我们已经了解了路由系统是怎么根据URL架构的改变来创建的Outgoing URL的。应用程序通常会定义若干路由,所以理解路由怎样被选中来进行URL创建就非常重要。路由系统是按照路由被添加到RouteCollection里面的顺序来处理的,RouteCollection对象是要传递给RegisterRoutes方法。对每一个路由会根据下面三个条件来进行是否匹配的检查: 1)提供的值必须对定义在URL模式里面的每一个segment变量是可用的。 为每一个segment寻找值时遵循如下规则: 首先,路由系统会在我们提供的值,也就是定义在匿名类型的属性里面的值中寻找 其次,在当前请求的变量值里寻找 最后,在我们定义路由时提供的默认值里面寻找 2)我们提供的segment变量的值可能都与定义在route里面的默认变量(default-only)一致。这些变量的默认值已经提供,但是这些变量并没有出现在我们定义的URL模式中。 例如有这样一个路由:routes.MapRoute("MyRoute", "{controller}/{action}", new { myVar = "true" });其中myVar就是default-only变量,为了让这个路由匹配, 我们必须注意不要为myVar提供一个值或确保我们提供的值能够匹配默认值。 3)所有segment变量的值必须满足路由约束 要明确的是:路由系统不是寻找最佳的匹配路由,仅仅是找第一个匹配的然后用它创建URL。只有找到了一个匹配的路由,那么路由系统就会忽略后面所有的路由。因此,我们定义路由时一定按照从具体到模糊的顺序。 下面进行单元测试Outgoing URLs View Code 针对其他控制器(Targeting Other Controllers) ActionLink方法默认是假定我们针对的是同一个Controller中的action方法,由该action方法来呈现view。如果要指定其他的Controller可以多加个参数如:@Html.ActionLink("About this application", "About", "MyController")。 传递额外的值(Passing Extra Values) 我们可以使用匿名类型的属性来传递segment变量的值。如@Html.ActionLink("About this application", "About", new { id = "MyID" })。生成的URL如下: <a href="/Home/About/MyID">About this application</a> 理解segment变量的重用 在我们描述路由匹配到传出的URLs时,我们提到当为每一个segment变量寻找值时,路由系统将会从当前的请求中寻找。现在我们定义这样一个路由如下: routes.MapRoute("MyRoute","{controller}/{action}/{color}/{page}") 接着在Index视图里面定义这样一个连接:@Html.ActionLink("点我啊", "Index", "Home", new { page = 789}, null).运行程序首先输入如下URL: http://localhost:<port>/Home/Index/Purple/123。页面呈现的链接是:<ahref="/Home/Index/Purple/789">点我啊</a>. 我们定义链接时并没有给color赋值,而这里的Purple是怎么来的呢? 这就是重用了刚开始传入的URL:http://localhost:<port>/Home/Index/Purple/123中的color值Purple。而且路由系统是重用page之前的segment变量的值。当我们对ActionLink做下修改:@Html.ActionLink("Click me", "List", "Catalog", new {color="Aqua"}, null); 这里我们提供了color的值,因为color在page之前,所以这里不会重用传入URL的color值。展示为:<ahref="/?color=Red">点我啊</a> 这里强烈建议我们避免这种行为出现,而是在定义URL模式时提供你需要的所有segment变量的值。 当我们提供的值跟segment变量的值不一致时,这个值会作为querystring附加在URL的后面。 例如:@Html.ActionLink("About this application", "About", new { id = "MyID", myVariable = "MyValue" }),创建的连接显示如下: <a href="/Home/About/MyID?myVariable=MyValue">About this application</a> 。 如果我们提供的值碰巧跟默认值一样,这时路由系统会忽略来自Outgoing URL的变量。例如:创建这样一个链接 @Html.ActionLink("About this application", "Index", "Home") 。显示的链接就是这样:<a href="/">About this application</a> 指定HTML属性 我们可以为创建的链接指定css样式,如可以指定一个样式类别为myCSSClass可以这样做: @Html.ActionLink("About this application", "Index", "Home", null, new {id = "myAnchorID",@class = "myCSSClass"})注意这里用了一个"@"符号,因为class是C#里面关键字,这里需要的是HTML样式类名。这样展示的<a>标签会多一个属性:<aclass="myCSSClass"href="/" id="myAnchorID">About this application</a> 创建绝对路径的URL 前面创建的都是相对路径,我们还可以创建全路径如下: @Html.ActionLink("About this application", "Index", "Home", "https", "myserver.mydomain.com", "myFragmentName",new { id = "MyId"}, new { id = "myAnchorID", @class = "myCSSClass"}) 。 这里建议我们尽量使用相对路径。因为全路径依赖于呈现给用户的应用程序的基础架构,有太多依赖绝对路径的大的应用程序最后因为网络基础设施或域名策略的改变而被破坏,而这种变化常常是程序员无法控制的。 有时我们需要将URL作为文本显示在页面上,这是可以是用Url.Action(),用法跟Html.ActionLink类似。 根据Routing Data创建链接或URL 如@Html.RouteLink("Routed Link", new { controller = "Home", action = "About", id="MyID"})。 在页面展示的链接如下: <a href="/Home/About/MyID">Routed Link</a> 使用Url.RouteUrl方法可以让创建的链接以文本形式显示。 在Action方法里面创建Outgoing URLs 大多数情况下,我们会在View里面创建Outgoing URLs,但有些时候我们也需要在action方法里面做类似的事情。方法一样,如下所示: View Code 根据一个具体的Route创建URL 我们在使用routes.MapRoute()时一般传了一个名字作为参数,如下面这样的: routes.MapRoute("MyRoute", "{controller}/{action}"); routes.MapRoute("MyOtherRoute", "App/{action}", new { controller = "Home" }); 给route命名有如下两个理由: 1.可以用来提示该路由的作用 2.在创建Outgoing URL时可以选择具体的route 我们在使用@Html.ActionLink("Click me","About")时具体会选择那一个route呢? 答案就是:定义在RegisterRoutes()里面的第一个route。这里选择的就是MyRoute。当然我们也可以自己指定一个route,如@Html.RouteLink("Click me", "MyOtherRoute", new { action = "About" }); 不建议使用命名路由的情形 创建Outgoing URL依赖route命名会打破"分解关注点"(这是MVC设计模式的核心思想)。当在view或action里面创建URL或链接时,我们的关注点是用户将被定向到的action和Controller,不是要使用的URL格式。所以我们倾向于避免给route命名,而是是用null代替。 好了,今天的笔记做到这里! 周末愉快! 本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2012/02/18/mvcnotes_19.html如需转载请自行联系原作者 张雪飞

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册