我们继续讲解LINQ to SQL语句,这篇我们来讨论Group By/Having操作符和Exists/In/Any/All/Contains操作符。 Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围。 说明:分配并返回对传入参数进行分组操作后的可枚举对象。分组;延迟 1.简单形式:
|
1 2 3 4 |
var q = from p in db.Products group p by p.CategoryID into g select g; |
语句描述:使用Group By按CategoryID划分产品。 说明:from p in db.Products 表示从表中将产品对象取出来。group p by p.CategoryID into g表示对p按CategoryID字段归类。其结果命名为g,一旦重新命名,p的作用域就结束了,所以,最后select时,只能select g。当然,也不必重新命名可以这样写:
|
1 2 3 |
var q = from p in db.Products group p by p.CategoryID; |
我们用示意图表示: 如果想遍历某类别中所有记录,这样:
|
1 2 3 4 5 6 7 8 9 10 |
foreach (var gp in q) { if (gp.Key == 2) { foreach (var item in gp) { //do something } } } |
2.Select匿名类:
|
1 2 3 4 |
var q = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, g }; |
说明:在这句LINQ语句中,有2个property:CategoryID和g。这个匿名类,其实质是对返回结果集重新进行了包装。把g的property封装成一个完整的分组。如下图所示: 如果想遍历某匿名类中所有记录,要这么做:
|
1 2 3 4 5 6 7 8 9 10 |
foreach (var gp in q) { if (gp.CategoryID == 2) { foreach (var item in gp.g) { //do something } } } |
3.最大值
|
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, MaxPrice = g.Max(p => p.UnitPrice) }; |
语句描述:使用Group By和Max查找每个CategoryID的最高单价。 说明:先按CategoryID归类,判断各个分类产品中单价最大的Products。取出CategoryID值,并把UnitPrice值赋给MaxPrice。 4.最小值
|
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, MinPrice = g.Min(p => p.UnitPrice) }; |
语句描述:使用Group By和Min查找每个CategoryID的最低单价。 说明:先按CategoryID归类,判断各个分类产品中单价最小的Products。取出CategoryID值,并把UnitPrice值赋给MinPrice。 5.平均值
|
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, AveragePrice = g.Average(p => p.UnitPrice) }; |
语句描述:使用Group By和Average得到每个CategoryID的平均单价。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品中单价的平均值。 6.求和
|
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, TotalPrice = g.Sum(p => p.UnitPrice) }; |
语句描述:使用Group By和Sum得到每个CategoryID 的单价总计。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品中单价的总和。 7.计数
|
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, NumProducts = g.Count() }; |
语句描述:使用Group By和Count得到每个CategoryID中产品的数量。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品的数量。 8.带条件计数
|
1 2 3 4 5 6 7 |
var q = from p in db.Products group p by p.CategoryID into g select new { g.Key, NumProducts = g.Count(p => p.Discontinued) }; |
语句描述:使用Group By和Count得到每个CategoryID中断货产品的数量。 说明:先按CategoryID归类,取出CategoryID值和各个分类产品的断货数量。 Count函数里,使用了Lambda表达式,Lambda表达式中的p,代表这个组里的一个元素或对象,即某一个产品。 9.Where限制
|
1 2 3 4 5 6 7 8 |
var q = from p in db.Products group p by p.CategoryID into g where g.Count() >= 10 select new { g.Key, ProductCount = g.Count() }; |
语句描述:根据产品的―ID分组,查询产品数量大于10的ID和产品数量。这个示例在Group By子句后使用Where子句查找所有至少有10种产品的类别。 说明:在翻译成SQL语句时,在最外层嵌套了Where条件。 10.多列(Multiple Columns)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var categories = from p in db.Products group p by new { p.CategoryID, p.SupplierID } into g select new { g.Key, g }; |
语句描述:使用Group By按CategoryID和SupplierID将产品分组。 说明: 既按产品的分类,又按供应商分类。在by后面,new出来一个匿名类。这里,Key其实质是一个类的对象,Key包含两个Property:CategoryID、SupplierID。用g.Key.CategoryID可以遍历CategoryID的值。 11.表达式(Expression)
|
1 2 3 4 |
var categories = from p in db.Products group p by new { Criterion = p.UnitPrice > 10 } into g select g; |
语句描述:使用Group By返回两个产品序列。第一个序列包含单价大于10的产品。第二个序列包含单价小于或等于10的产品。 说明:按产品单价是否大于10分类。其结果分为两类,大于的是一类,小于及等于为另一类。 Exists/In/Any/All/Contains操作符 适用场景:用于判断集合中元素,进一步缩小范围。 Any 说明:用于判断集合中是否有元素满足某一条件;不延迟。(若条件为空,则集合只要不为空就返回True,否则为False)。有2种形式,分别为简单形式和带条件形式。 1.简单形式: 仅返回没有订单的客户:
|
1 2 3 4 |
var q = from c in db.Customers where !c.Orders.Any() select c; |
[…]
View Details很多在 Mac 上安装 Virtual Box 虚拟机的小伙伴,在安装完成系统以后,发现显示效果不好,很小,也不能全屏。其实这是因为在虚拟机系统里没有安装 Virtual Box 的增强驱动造成的。这里简单介绍下怎么在 Virtual Box 里安装增强驱动的操作方法。 工具/原料 Virtualbox 方法/步骤 首先请在 Virtual Box 里启动安装好的 Windows 虚拟机,如图所示 当虚拟机启动并进入系统以后,请保持这个虚拟机的窗口在最前端,然后点击屏幕顶部的 Devices 菜单栏。 接着请点击菜单栏中的 Insert Guest Additions CD image 一栏,如图所示 随后我们在返回虚拟机中的系统,一般情况下系统会弹出它的安装界面。如果没有弹出来的话,请打开我的电脑,找到它的盘符,双击也可以运行安装。 接着在 Virtual Box 增强工具的安装界面里,根据提示操作一步一步点击安装即可。 安装完成以后,需要重新启动虚拟机系统,之后就可以调整虚拟机的分辨率,也可以实现全屏状态了。 from:http://jingyan.baidu.com/article/6525d4b13b7d0fac7d2e94ef.html
View Details在这篇文章中,我们将讨论成为一个成功的软件工程师需要注意哪些要点,以便于鞭策自己也成为一个成功的软件工程师。 背景 上周,我参加了印度德里最值得期待的会议——C# Corner annual conference。如果你需要了解更多,那么请点这里。当我知道我有机会聆听大师级谈话的时候,真的非常惊喜。我学到了很多。下面我会把我听到的来自于Mr. Glenn Block的关于“如何成为一个成功的软件工程师”的要点分享给大家。这些内容激励了所有的与会者。Mr. Glenn Block是一位前微软员工,他曾在微软工作了近10年,并且他一直是Azure、WCF、.NET等的一部分,目前,他正担任着Splunk的首席产品经理。 我在写这篇文章前得到了Mr. Glenn Block的允许。 如何成为一个成功的软件工程师? 我发现Mr. Glenn Block提出的所有建议都非常有意义,并且我们每个人都应该好好学习。 不要害怕失败 我们是开发人员和程序员。我们也是人,我们也会犯错。你是不是没有任何错误就创建好了软件无关紧要。反倒是如果你这么说了,那么你可能需要确定你的软件是否能够正常工作。记住爱因斯坦有一句名言:“不要害怕失败。” 不要害怕失败,失败是你最好的老师。我们都曾犯过一些导致我们失败的错误,但更重要的是要从错误中学习。如果你这样做了,那么也许你的下一次尝试就成功了。 如果你从来没有失败过,那么说明你畏头畏尾,从来没有尝试过任何新的东西。 不要害怕寻求帮助 我们都工作在一个会犯错会失败的环境中。所以,你不应该害怕寻求别人的帮助。这样可以减少你的工作压力,并让你能够按时交付产品!而这正是你的经理对你的要求。有时候,你的后辈也能指引你走向正确的道路。所以,不要害怕寻求帮助。让你的自负随风而去吧。 做一个持续的学习者 这个时代每时每刻都有新事物被发明被创造。这在IT行业也是如此。每一天都有新的东西需要学习。在一天结束时,你学到了什么才是最重要的。你应该尝试所有与开发相关的技术。同时,重要的要掌握其中一些技术。 你不能掌握所有内容 在看完以上几点之后,你的脑海中可能会出现这样一个念头:“我怎么才能学习所有的内容呢?”当我说要成为一个持续的学习者时,其实这受你真正能学到什么的限制。你只需要去尝试你认为对你的编程生涯有帮助的技术。当然,正如我在上面所说,你必须掌握其中的一些技术。 重视你的代码 在你写代码的时候,只要确保代码确实能用一种清晰和易于阅读的方式如愿实现目标即可。我的朋友,Mr. Dhananjay Kumar说Mr. Glenn Block写代码就像是诗人在写诗歌一样,非常值得我们借鉴。此外,代码的可维护性也非常重要,否则维护这些代码的人搞不好在几天/月/年之后就得经历一场求生不得求死不能的痛苦。 找导师,成为导师 老师能够传业授道解惑,能帮助我们理解学习的内容。因此,找到一个能指点正确方向的导师尤为重要。向你的导师学习,因为导师可以教你许多他/她从他/她的生活中总结出来的内容。正如大家都知道的,“经验让人完美”!一旦你学会了,那不妨也成为别人的导师,分享你从你的导师那里学到的知识。当然,在做导师的时候,请确保不要误人子弟。 不要拖后腿 不可否认我们周围有不少拖后腿的人。虽然没有强制要求说所有人都必须优秀。但是有时你可能会不得不和一个消极被动的人一起工作。但是重要的是,你得保持住自己的乐观和主动性。 不要过度承诺 我们的项目都有时间期限,这是我们都知道的。你在时间框架中能做什么是有限制的。要去理解那些。当你接受需求列表时,你应该清楚你需要付出什么样的努力以及多少时间才能完成工作。如果不能满足你的经理/客户给出的时间框架,那就随时告知报告人。发布如他们期望那样而非满是bug的产品很重要。所以,千万不要过度承诺。如果你这样做了的话,那就准备好再找一份工作吧。因为你可能会被炒鱿鱼。 永远不要在你想说“No”的时候违心地说“Yes”。 正确的想法不必是你的想法 这一点还需要我解释吗? 我们都在工作,我们都有脑子,我们都有自己的想法。有时候你的后辈也可以教你很多,有时候他解决问题的速度快于你。承认这一点,并赞同他们给出的解决方案。集思广益将有助于按时交付项目。重要的是,这能帮助你做到不以自我为中心。 做一个良好的倾听者 做一个良好的倾听者,意味着你可以通过他人的角度来看事情。这将丰富你的阅历提高你的声誉。如果他们错了,你就向他们解释他们错了以及为什么。 测试,测试,还是测试 测试是软件开发周期中最重要的角色之一。没有经过适当测试之前永远不要发布你的产品,因为测试是捕获bug的阶段,而bug是为客户和管理者所不喜的。如果你认为你已经做完测测试了,那么再做一次。 问:开发人员说的最多的谎言是什么? 答:我已经做过单元测试了。 模式 始终追求适合你项目的最相关的模式。如果你根据自己的要求选择模式的话,它可能会在最后的周期使你功亏一篑。 问:软件开发中最重要的阶段是什么? 答:需求收集或需求理解。 成为社区的一部分 这一点也非常重要。你需要成为一些社区的一份子,因为这些都能给我们提供帮助。推荐一些很不错的社区: C# Corner MSDN ASP.NET Stack Overflow Code Project 这种方式可以让你在网络世界中被大家所关注。分享你的所有知识,并尽可能地从各种资源获取知识。 致力于OSS(Open Source) 如果你得到一个机会可以致力于开源项目,那么一定不要错过,一定要勇往直前。这将增加你的声誉,因为开源项目正在被数十亿用户使用。 结论 最后但并非最不重要的一点,如果有任何遗漏的地方,欢迎给出你的建议和反馈。 稿源:码农网
View DetailsWhat are attributes and why do we need it? How can we create custom Attributes? Is it possible to restrict a custom attribute to a method only? Other than information what more can we do? Do attributes get inherited ? What if we want some attributes to be prevented from inheriting? If I want an attribute to be used only once in a program? What are attributes and why do we need it? “Attribute is nothing but a piece of information”. This information can be attached to your […]
View Details最近国内外都在流行一个词叫Full Stack,中文翻译过来叫全栈工程师,也叫全端工程师。微博上很多专业人士都在讨论全端工程师,有赞有毁的。我对全端工程师的定义是:掌握多种技能,并能利用多种技能独立完成产品的人。打外比方,全栈工程师就是一个能独立盖一幢10层小洋楼的人,而普通工程师,则是可以和一群人盖一幢摩天大楼的人。 至于要掌握哪些技能,我觉得这个要跟从事的行业与技术方向有关,做互联网的和做软件的是不一样的,即使是做互联网的,后端也可以分为很多种技术流派。 8/2定律在哪都适用,全栈工程师就是掌握20%常用技能的人,但这20%的技能会有80%的几率被用到,剩下那80%不常用的,让我们Google吧。 有人说,全栈工程师在中国已经很多年了,他们叫站长。这个说话有点靠谱但又不那么靠谱,我自己也做过站长,深知作为一名站长需要掌握很多种技术。不靠谱的是,很多站长其实并没有真正写过多少代码,而是熟练利用一些建站软件来建站。 全栈工程师的价值 有人说了,你再牛逼,你懂五种技术,你能干五个人的活吗?全栈工程师并不是说一个人能干几个人的活,而是要从多个方面来看这个问题。 全局性思维 现代项目的开发,很少说只用到一两种技术的,特别是移动互联网大潮下。随便一个互联网项目中用到的技术,就会需要用到后端开发、前端开发、界面设计、产品设计、数据库、各种移动客户端、三屏兼容、restFul API设计和OAuth等等,一些比较前卫的项目,可能会用到Single Page Application、Web Socket、HTML5/CSS3这些技术,还有像第三方开发像微信公众号微博应用等等。 Web前端也远远不是从前的切个图用个jQuery上个AJAX兼容各种浏览器那么简单了。现代的Web前端,你需要用到模块化开发、多屏兼容、MVC,各种复杂的交互与优化,甚至你需要用到Node.js来协助前端的开发。 所以说一个现代化的项目,是一个非常复杂的构成,我们需要一个人来掌控全局,他不需要是各种技术的资深专家,但他需要熟悉到各种技术。对于一个团队特别是互联网企业来说,有一个全局性思维的人非常非常重要。 像如果是我经手的项目,我肯定会注意到网页优化,也会考虑到API来兼容各种客户端,更会考虑到三屏兼容的问题。不会说项目中完全使用AJAX而不顾SEO,也不会为了功能性而忽略访问速度,我会很好的把握这个平衡,因为我知道它们的权重与实现成本。 沟通成本 项目越大,沟通成本越高,做过项目管理的人都知道,项目中的人力是1+1<2的,人越多效率越低。因为沟通是需要成本的,不同技术的人各说各话,前端和后端是一定会掐架的。每个人都会为自己的利益而战,毫不为已的人是不存在的。< p=""> 而全栈工程师的成本几乎为零,因为各种技术都懂,胸有成竹,一不小心自己就全做了。即使是在团队协作中,与不同技术人员的沟通也会容易得多,你让一个后端和一个前端去沟通,那完全是鸡同鸭讲,更不用说设计师与后端了。但如果有一个人懂产品懂设计懂前端懂后端,那沟通的结果显然不一样,因为他们讲的,彼此都能听得懂。 创业公司 对于创业公司来说,全端工程师的价值是非常大的,创业公司不可能像大公司一样,各方面的人才都有。所以我们需要一个多面手,各种活都能一肩挑,独挡多面的万金油。对于创业公司,不可能说DBA前端后端客户端各种人才全都备齐了,很多工作请人又不饱和,不请人又没法做,外包又不放心质量,所以全端工程师是省钱的一妙招。虽然说全端工程师工资会比一般的工程师会高很多,但综合下来,成本会低很多。 全栈工程师的困境 我讲技术有两个发展方向,一种是纵向一种是横向的,横向的是瑞士军刀,纵向的是削铁如泥的干将莫邪。这两个方向都没有对与错,发展到一定程序都会相互溶合,就好比中国佛家禅修的南顿北渐,其实到了最后,渐悟与顿悟是一样的,顿由渐中来。 如果一个公司不太懂全栈工程师的价值,那么全栈工程师的地位将会很尴尬,说得不好听一点,全栈工程师就是什么都会,都么都不会。曾经有一次面试,对方问我很基础的问题,我答不上来,我能做出产品,也知道什么是怎么一回事,我也不会犯那些错误,但我就是答不上概念,要考倒我非常容易。所以在应聘面试的时候,有些时候会吃亏,你可能会不如哪些在某一方面钻得很深的人工资拿得高。 由于经常在各种技术穿梭,我会经常忘记代码的语法和一些API,所以我经常需要去查API甚至查语法,我觉得没有Google我几乎没法工作。这在某些人的眼里,是技术不够的表现。我记的只是一个Key,一个如何找寻答案的索引,而不是全部,人脑不是电脑,我不可能要求我能记下所有的东西。 有一次面试官问我一个问题,我说我不知道,但我猜大概是如此这般,对方问我,你为什么这么猜,我说凭直觉,对方笑了笑没说话。面试完后我一查,果然和我猜的差不多。没错,我就是凭直觉,但这种直觉和女人的直觉不一样,这种直觉是技术上的直觉,是你过去技术经验累积的一个反射。 我不是一个非常专业的Web前端,也不是一个非常专业的Node.js开发工程师,更不是一个非常专业的iOS开发工程师。用人单位会问我,你到底是专业做哪一个方面的,我为什么要给你这么高的工资? 有什么资格来谈全栈工程师 我应该算是一个全栈型工程师了,行业经验已经超过10年。独立做过不少产品,也带过不少项目,经过的产品包括桌面端、Web产品、移动端产品,Web端涵盖前端与后端,移动端主要做iOS和混合开发。 熟悉Web前端,对MVC/模块化开发有实战经验,熟悉CoffeeScript、Grunt、RequireJS、Handlebars等等,自己写过小型的Javascript框架,一个项目中的JS代码超过一万行。熟知网页优化,知道如何让网页变得更加快速。也略懂SEO,知道什么样的URL和代码会更讨好Spider。 熟悉Node.js,有几个项目都是基于Node.js的,目前发布有开源的Blog程序Purelog,在NPM上有多个模块发布。熟悉混合开发,过去我曾经有超过一年的时间是在研究Hybrid技术,多个App基于混合开发技术,也有开发类似于PhoneGap的解决方案。对HTML5在手机上的表现颇为熟悉,挖过很多的技术坑,如白屏问题,Sqlite问题,滚动条问题,硬件动画加速、点击延时问题等等。 会做设计,熟悉Photoshop,所有的产品不管是Logo还是界面全都是自己做的设计,虽然在资深的设计师眼里不值一提,但在工程师队伍中算是比较另类了。 熟悉Objective-C,有两年以上的iOS开发经验,在App Store上有约十款App。熟悉服务器的一般性操作,自己有VPS并运行多个网站,虽然配置服务器经常要去Google。 早年曾经做过一年的Delphi,也曾做过几年的ASP.net,虽然这些技术我目前已经放弃,完全转向*nix平台,但累积下的经验是在的。多年的项目管理经验,曾在三个公司担任过项目经理,累计项目管理经验超过4年。在多个科技门户发表过技术和评论文章。 为什么我会成为全栈工程师 我相信很多全栈型工程师会和我一样,是因为要创业才成为全栈型工程师的。我有一颗创业和做产品的心,而且我又是一个不愿意麻烦别人的人,有些人擅长整合资源,空手套白狼,但我显然不是这种人,所以我只好自己做了。 在经历过两次孤独的创业之后,我发现我并不是一个适合独立创业的人,所以,我成为了一个全端工程师。我最初是做ASP,后来自己创业写客户端用Delphi,然后写了三年的ASP.Net,2010年的时候因为公司需要开始做iOS开发。Web前端是一直自己在做,项目中的的Javascript基本都是我自己在做。 我热爱写代码,热爱重复发明轮子,热爱新技术,我想这也是我成为一个全栈工程师的重要原因。 于我自己来说,我觉得全端工程师的乐趣要比一般工程师来得多,因为你知道一个产品的形态,你可以去设计一个产品,你是从全局的视野来做事情,你得到的成就感会更多一些。 from:http://digi.163.com/14/0116/10/9IN26JNS00162OUT.html
View Details如何在ASP.NET中用C#将XML转换成JSON 本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用。或许你可以直接利用JavaScript代码通过Ajax的方式来读取XML,然后直接对其中的内容进行解析,这样或许更直接一些。但本文中给出的代码旨在说明如何通过原生的C#代码来完成这一转换。除此之外,你仍然可以借用一些第三方类库或者更高级一些的.NET库对象来实施转换。我们来看看这里介绍的一些较为简单的方法,但前提是你必须拥有可支持的类库和对象以备使用。 使用Json.NET类库 前提是需要首先下载和安装Json.NET类库,在这里可以找到http://json.codeplex.com/ 下面是一个例子:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using Newtonsoft.Json; namespace JSonConverter { class Program { static void Main(string[] args) { string xml = "<Test><Name>Test class</Name><X>100</X><Y>200</Y></Test>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc); Console.WriteLine("XML -> JSON: {0}", json); Console.ReadLine(); } } } |
使用.NET Framework中的JavaScriptSerializer类 首先需要确保你的工程或服务器支持.NET 4.0或以上版本的Framework,否则无法找到该类。 下面是一个例子:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System; using System.Linq; using System.Web.Script.Serialization; using System.Xml.Linq; class Program { static void Main() { var xml = @"<Columns> <Column Name=""key1"" DataType=""Boolean"">True</Column> <Column Name=""key2"" DataType=""String"">Hello World</Column> <Column Name=""key3"" DataType=""Integer"">999</Column> </Columns>"; var dic = XDocument .Parse(xml) .Descendants("Column") .ToDictionary( c => c.Attribute("Name").Value, c => c.Value ); var json = new JavaScriptSerializer().Serialize(dic); Console.WriteLine(json); } } |
其输出结果为:{"key1":"True","key2":"Hello World","key3":"999"} 可能还会有更多的方法,这里不一一列出了。那么如何使用原生的C#代码将XML转换成JSON格式字符串呢?或者说该C#代码在较低版本的.NET Framework中也可以运行呢?来看看下面的介绍吧。 Introduction JSON是一个轻量级的数据交换格式,它可以非常容易地被页面的JavaScript编码为对象的形式,从而方便数据操作。 基于AJAX的页面使用XmlHttpRequest对象从服务端接收数据来响应用户的请求,当返回的数据是XML格式时,它可以被转换为JSON格式的字符串从而通过JavaScript更加容易地对数据进行处理。 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。下面的ASP.NET C#代码实现了这一过程。 Code Description 代码中提供了一个方法XmlToJSON,可以用来将XmlDocument对象转换为JSON字符串。代码通过迭代每一个XML节点、属性以及子节点,来创建对应的JSON对象。 代码不会生成数字和布尔类型的值 Xml DocumentElement对象始终会被转换为JSON对象的member:object,它遵循下面这些规则。 节点的属性会被对应地转换为JSON对象的成员"attr_name":"attr_value"。如: XML JSON <xx yy=’nn'></xx> { "xx" : { "yy" : "nn" } } <xx yy="></xx> { "xx" : { "yy" : "" } } 没有子节点、属性和内容的节点被转换为成员"child_name":null XML JSON <xx/> { "xx" : null } 没有子节点和属性,但是有内容的节点被转换为成员"child_name":"child_text" XML JSON <xx>yyy</xx> { "xx" : "yyy" } 其它节点和属性会被适当地转换为"child_name":对象或者"child_name":[elements]对象数组,节点的值会被转换为对象成员的"value",如: XML JSON <xx yy=’nn'><mm>zzz</mm></xx> { "xx" : { "yy" : "nn", "mm" : "zzz" […]
View Details一、XML和JSON字符串的对应表格 1、节点的属性会被对应地转换为JSON对象的成员"attr_name":"attr_value"。如: XML JSON <xx yy=’nn'></xx> { "xx" : { "yy" : "nn" } } <xx yy="></xx> { "xx" : { "yy" : "" } } 2、没有子节点、属性和内容的节点被转换为成员"child_name":null XML JSON <xx/> { "xx" : null } 3、没有子节点和属性,但是有内容的节点被转换为成员"child_name":"child_text" XML JSON <xx>yyy</xx> { "xx" : "yyy" } 4、其它节点和属性会被适当地转换为"child_name":对象或者"child_name":[elements]对象数组,节点的值会被转换为对象成员的"value",如: XML JSON <xx yy=’nn'><mm>zzz</mm></xx> { "xx" : { "yy" : "nn", "mm" : "zzz" } } <xx yy=’nn'><mm>zzz</mm><mm>aaa</mm></xx> { "xx" : { "yy" : "nn", "mm" : [ "zzz", "aaa" ] } } <xx><mm>zzz</mm>some text</xx> […]
View Details在调用RSA加密的.pfx密钥时,在本地调试没有问题,可以布署到服务器,就会报以下的错误: 用户代码未处理 System.Security.Cryptography.CryptographicException
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span style="line-height:1.5 !important;"> HResult</span>=-<span style="color:#800080;line-height:1.5 !important;">2146893792</span><span style="line-height:1.5 !important;"> Message</span>=<span style="line-height:1.5 !important;">出现了内部错误。 Source</span>=<span style="line-height:1.5 !important;">mscorlib StackTrace: 在 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 在 System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle</span>&<span style="line-height:1.5 !important;"> pCertCtx) 在 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) 在 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags) 在 xxxxx.API.Tools.RSA.Sign(String data, String keyPath, String keyPasswd) 在 xxxxx.API.Tools.Encrypt.signANDencrypt(MsgBean req_bean) 在 xxxxx.API.xxxxx.GetBankCardInfo(String orderId, String cardNo) 在 xxxxx.GetBankCardInfo(GetBankCardInfoReq request) 位置 d:\app_service\WHTR_SOA\WHTR.SOA.Services\OnlinePay\Yilian\OnlinePayService.cs:行号 </span><span style="color:#800080;line-height:1.5 !important;">108</span><span style="line-height:1.5 !important;"> 在 Castle.Proxies.Invocations.xxxxx.InvokeMethodOnTarget() 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 xxxxx.CastleMethodInvocation.Proceed() 位置 d:\xxxxx.cs:行号 </span><span style="color:#800080;line-height:1.5 !important;">80</span><span style="line-height:1.5 !important;"> 在 xxxxx.Intercept(IMethodInvocation invocation) 位置 d:\xxxxx.cs:行号 </span><span style="color:#800080;line-height:1.5 !important;">56</span><span style="line-height:1.5 !important;"> InnerException: </span> |
处理方法: IIS 应用程序池--选中你网站的所配置的应用程序池--右键 选择 “高级配置” --将“加载用户配置文件” 设置为True 。问题解决 from:http://www.cnblogs.com/jys509/p/4499978.html
View Details|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
//------------------------------------------------------------------------------ // <copyright file="CryptoUtil.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // </copyright> //------------------------------------------------------------------------------ namespace System.Web.Security.Cryptography { using System; using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Text; using System.Web.Util; // Contains helper methods for dealing with cryptographic operations. internal static class CryptoUtil { /// <summary> /// Similar to Encoding.UTF8, but throws on invalid bytes. Useful for security routines where we need /// strong guarantees that we're always producing valid UTF8 streams. /// </summary> public static readonly UTF8Encoding SecureUTF8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); /// <summary> /// Converts a byte array into its hexadecimal representation. /// </summary> /// <param name="data">The binary byte array.</param> /// <returns>The hexadecimal (uppercase) equivalent of the byte array.</returns> public static string BinaryToHex(byte[] data) { if (data == null) { return null; } char[] hex = new char[checked(data.Length * 2)]; for (int i = 0; i < data.Length; i++) { byte thisByte = data[i]; hex[2 * i] = NibbleToHex((byte)(thisByte >> 4)); // high nibble hex[2 * i + 1] = NibbleToHex((byte)(thisByte & 0xf)); // low nibble } return new string(hex); } // Determines if two buffer instances are equal, e.g. whether they contain the same payload. This method // is written in such a manner that it should take the same amount of time to execute regardless of // whether the result is success or failure. The modulus operation is intended to make the check take the // same amount of time, even if the buffers are of different lengths. // // !! DO NOT CHANGE THIS METHOD WITHOUT SECURITY [MethodImpl(MethodImplOptions.NoOptimization)] public static bool BuffersAreEqual(byte[] buffer1, int buffer1Offset, int buffer1Count, byte[] buffer2, int buffer2Offset, int buffer2Count) { Debug.ValidateArrayBounds(buffer1, buffer1Offset, buffer1Count); Debug.ValidateArrayBounds(buffer2, buffer2Offset, buffer2Count); bool success = (buffer1Count == buffer2Count); // can't possibly be successful if the buffers are of different lengths for (int i = 0; i < buffer1Count; i++) { success &= (buffer1[buffer1Offset + i] == buffer2[buffer2Offset + (i % buffer2Count)]); } return success; } /// <summary> /// Computes the SHA256 hash of a given input. /// </summary> /// <param name="input">The input over which to compute the hash.</param> /// <returns>The binary hash (32 bytes) of the input.</returns> public static byte[] ComputeSHA256Hash(byte[] input) { return ComputeSHA256Hash(input, 0, input.Length); } /// <summary> /// Computes the SHA256 hash of a given segment in a buffer. /// </summary> /// <param name="buffer">The buffer over which to compute the hash.</param> /// <param name="offset">The offset at which to begin computing the hash.</param> /// <param name="count">The number of bytes in the buffer to include in the hash.</param> /// <returns>The binary hash (32 bytes) of the buffer segment.</returns> public static byte[] ComputeSHA256Hash(byte[] buffer, int offset, int count) { Debug.ValidateArrayBounds(buffer, offset, count); using (SHA256 sha256 = CryptoAlgorithms.CreateSHA256()) { return sha256.ComputeHash(buffer, offset, count); } } /// <summary> /// Returns an IV that's based solely on the contents of a buffer; useful for generating /// predictable IVs for ciphertexts that need to be cached. The output value is only /// appropriate for use as an IV and must not be used for any other purpose. /// </summary> /// <remarks>This method uses an iterated unkeyed SHA256 to calculate the IV.</remarks> /// <param name="buffer">The input buffer over which to calculate the IV.</param> /// <param name="ivBitLength">The requested length (in bits) of the IV to generate.</param> /// <returns>The calculated IV.</returns> public static byte[] CreatePredictableIV(byte[] buffer, int ivBitLength) { // Algorithm: // T_0 = SHA256(buffer) // T_n = SHA256(T_{n-1}) // output = T_0 || T_1 || ... || T_n (as many blocks as necessary to reach ivBitLength) byte[] output = new byte[ivBitLength / 8]; int bytesCopied = 0; int bytesRemaining = output.Length; using (SHA256 sha256 = CryptoAlgorithms.CreateSHA256()) { while (bytesRemaining > 0) { byte[] hashed = sha256.ComputeHash(buffer); int bytesToCopy = Math.Min(bytesRemaining, hashed.Length); Buffer.BlockCopy(hashed, 0, output, bytesCopied, bytesToCopy); bytesCopied += bytesToCopy; bytesRemaining -= bytesToCopy; buffer = hashed; // next iteration (if it occurs) will operate over the block just hashed } } return output; } /// <summary> /// Converts a hexadecimal string into its binary representation. /// </summary> /// <param name="data">The hex string.</param> /// <returns>The byte array corresponding to the contents of the hex string, /// or null if the input string is not a valid hex string.</returns> public static byte[] HexToBinary(string data) { if (data == null || data.Length % 2 != 0) { // input string length is not evenly divisible by 2 return null; } byte[] binary = new byte[data.Length / 2]; for (int i = 0; i < binary.Length; i++) { int highNibble = HttpEncoderUtility.HexToInt(data[2 * i]); int lowNibble = HttpEncoderUtility.HexToInt(data[2 * i + 1]); if (highNibble == -1 || lowNibble == -1) { return null; // bad hex data } binary[i] = (byte)((highNibble << 4) | lowNibble); } return binary; } // converts a nibble (4 bits) to its uppercase hexadecimal character representation [0-9, A-F] private static char NibbleToHex(byte nibble) { return (char)((nibble < 10) ? (nibble + '0') : (nibble - 10 + 'A')); } } } |
我在开发测试过程中,发现使用wx.onMenuShareTimeline无效果,没有显示我定义的图片、title和链接,经过调试发现原因如下: 1.图片大小要大于300pix才能显示 2.这个方法必须先config成功,然后再wx.ready里才能调用。我直接放到$(function(){})里执行,实践证明是不行的。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '{$appid}', // 必填,公众号的唯一标识 timestamp: "{$signPackage.timestamp}", // 必填,生成签名的时间戳 nonceStr: '{$signPackage.nonceStr}', // 必填,生成签名的随机串 signature: '{$signPackage.signature}',// 必填,签名,见附录1 jsApiList: ['checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function () { wx.onMenuShareTimeline({ title: '--{$info.name}', // 分享标题 link: '{$url}__URL__/index?pid={$pid}&puid={$uid}', // 分享链接,将当前登录用户转为puid,以便于发展下线 imgUrl: '{$url}__PUBLIC__/Uploads/{$goodsvo.image}', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 alert('分享成功'); }, cancel: function () { // 用户取消分享后执行的回调函数 } }); wx.error(function (res) { // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 alert("errorMSG:" + res); }); }); |
from:http://www.cnblogs.com/zhouyu629/p/4496065.html
View Details