微软最有价值技术专家(MVP),著有《编写高质量代码:改善C#程序的157个建议》,有着十多年的软件从业资历。
一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2:打开所在的文件夹 右键单击任何一个文件选项卡, 选择"打开所在的文件夹",或在 Solution Explorer 的文件上面点右键; 3:比对同一个文件 鼠标向下拖动红框内的图标。
Easy UI 的各类控件有些带了遮罩功能,如 DataGrid,可以这样使用: //显示遮罩 $("#dg").datagrid("loading", "数据加载中……"); //隐藏遮罩 $("#dg").datagrid("loaded"); 在有些情况下,我们不能直接使用控件本身的遮罩效果,比如: 1:有些控件则没有这样的属性,比如 Tabs; 2:页面初始加载时; 3:通过 Ajax 异步获取数据并刷新当前页面; 这个时候,就要采用另外的办法来进行遮罩。
EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,可根据情况具体使用。 一:使用 datagrid 默认机制 后台: public JsonResult GetQuestionUnit() { // ...
一:Reshaper是什么 即便是那些整天攻击 .NET 和 C# 的人,也常常不得不承认 Visual Studio 确实是个够强大的 IDE,除非他认为更少的 IDE 功能和命令行调试才是更强大的。
基于权限控制的考虑,在整个后台的开发中,菜单和按钮是可以被自定义的,也就是说: 1:每开发一个页面,就需要在系统管理的 菜单管理 中进行设置; 2:每个页面中的按钮,也是在 菜单管理 中的设置按钮部分进行设置; 具体步骤如下: 一:创建页面与菜单的对应管理 比如,现在我们创建了一个页面,该页面用户展示页面分类,则需要首先进入 菜单管理: 然后,选择你要将新菜单附加在哪个节点上,具体是在上面的列表中选中某节点就可以,然后在菜单管理中点击添加: 设置菜单名,已经菜单对应的LOGO,当然,重点是填写如 URL,根据系统本身的特点,我们这里填写的是一个相对路径(即以"/”开头)。
如果你不幸在 windows server 2008 R2 的 IIS7 中部署 MVC 站点的话,如果你输入:http://yourdomain/Organization/Index ,那么你很有可能会碰到: 404 恭喜你,中标了。
TFS非常强大,但是权限设置确实非常的恶心复杂,这貌似是一切NB又傲慢的软件的通病。 那么,在哪里设置 WorkItem 的权限呢? 第一步: 第二步: 第三步,下面你将一目了然。 第四步,Shared Query共享 经过上面的步骤,还不能将 Shared Queries 共享出来,那么,我们还需要: 本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。
一:场景 出于某种理由,需要由asp.net引擎处理所有可能出现的无效URL的Request。 二:现状 对于无效URL,一般会由IIS返回404错误。当然,也可以自定义Custom Error Page,但是在这种情况下,并不能处理原URL所代表的Request的数据(如表单数据)。
实际上“单元测试不可测试那些类(无抽象、静态类、静态方法)”是个伪命题,因为事实是:无抽象、静态类、静态方法都是不可单元测试的。那么,如果我们要写出可测试的代码,又要用到这些静态类等,该怎么办,实际上我们需要两个步骤: 1:为它们写一个包装类,让这个包装类是抽象的(继承自接口,或者抽象类,或者方法本身是Virtual的); 2:通知客户端程序员,使用包装类来代替原先的静态类来写业务逻辑; 实际上,微软也是这么干的,我在上一篇博文《单元测试WebForm的UI逻辑及文件上传》写到,最典型的不可测试类,那就是WebForm架构的网站中,对Response等的模拟。
BS系统中的UI部分的逻辑测试,最首要的就是要模拟请求(Request)和输出(Response),而WebForm又跟MVC不一样,后者的Response,Request等HTTP上下文对象均有接口支持,很容易模拟,而查看WebForm的对应对象,如Response,我们首先看到的声明就是: ...
鉴于一些理由需要拦截WCF方法,比如参数的检测。一个实际的场景是CSRF防范中需要对CsrfToken的检测。要实现拦截,在形式上要实现两点:1:为WCF方法增加特性类;2:捕获WCF方法;第一点很好实现,实现一个Attribute类。
这是以前在VS2010上让同事做的相关工作的备案,现在VS2012都出来了,2010都快过期,帖出来共享一下。 一、单元测试 微软官方给出的指导和示例在这里。一步一步按照说明下来就可以完成。(不截图说明了)。
如果网站原本是http传输,在部署成https传输后,一不小心就会出现如下的安全提示: “This page contains both secure and non secure items. Do you want to display non-secure items?”或者 “此网站包含的...
1:localhost.和127.0.0.1.带来的URL行为不一致 无法走本地代理,这个无法本地调试的问题并不是个BUG,微软官方是有给出过解释的,这是源于IE浏览器和.NET框架对于本地请求是不走代理的,因而Fiddler无法检测数据。
1:需求 已知数组int[] max={72, 54, 59, 30, 31, 78, 2, 77, 82, 72};用快速排序算法按降序对其进行排列,并返回数组。 思路: 快速排序有两个方向,左边的i下标一直往右走,当a[i] a[center_index]。
异步、多线程、任务、并行编程之一:选择合适的多线程模型 本篇概述: @FCL4.0中已经存在的线程模型,以及它们之间异同点; @多线程编程模型的选择。 1:异步、多线程、任务、并行的本质 这四个概念对应在CLR中的本质,本质都是多线程。
Microsoft同步工具SyncToy http://www.cnblogs.com/daizhj/archive/2009/11/03/1595395.html http://www.cnblogs.
出现过几次被客户要求既有项目为什么不能单独部署WebServer和ApplicationServer的问题,他们用的例子无非就是Apache+Tomcat,他们称之为前面为WebServer,后面为ApplicationServer,问我们的IIS为什么不能这样部署。
原理 爆破是对系统的登录入口发起不间断的请求,达到暴力破解的目的。 实际案例 某系统存在爆破攻击点,只要模拟以下攻击,就能采用字典破解法,根据分析发现,只要返回状态为302的,为用户名密码正确,也就是被爆破了,状态为200的,为用户名密码错误。
原理 CSRF,Cross Site Request Forgery,即跨站点请求伪造。 这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作。比如:如果删除用户操作(如,yourdomain.com/deluser?id=123)没有经过防范CSRF的处理,那么,假设用户登录系统后,攻击者诱使用户同时访问了攻击者的站点的一个链接(该链接正好为yourdomain.com/deluser?id=123),那么,系统就会在用户不知情的情况下丢失一个用户。
原理 会话劫持是指通过非常规手段,来得到合法用户在客户端和服务器段进行交互的特征值(一般为sessionid),然后伪造请求,去访问授权用户的数据。 获取特征值的非常规有段主要有如下几种: 首先是猜测的方式,如果我们的sessionid的生成是有规律的,那么使用猜测的方式就可以到达非法获取的目的,如图所示: 其次是session fixation攻击。
原理跨站脚本(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。 我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。
1:HTTP重定向 所谓HTTP重定向,就是通过修改HTTP响应头中的Location标识为新的URL,然后返回给客户端,让客户端重新根据这个Location标识的URL去做新的请求。 这是一种最简单、也是最轻量级的负载均衡实现方案,使用asp.
AOP的特性使得它非常适合用来设计类似权限控制的功能,这是本文的基础,如果想要了解AOP的实现,可以参考《动态织入的AOP实现》。 在基于角色的访问控制(RBAC)中,有三要素:用户、角色、任务(或操作)(User、Role、Task),其稳定性逐渐增强,两个关系,UserRole、RoleTas...
动态织入的AOP实现,有两种方法: 第一类,借助于Remoting命名空间下的几个类,通过获取当前上下文及反射的机制来实现,这需要被AOP的类需要继承自arshalByRefObject或者ContextBoundObject; 第二类,原理是基于动态代理的思想,即在运行时动态构造一个原有类的子类,这样就可以在子类的重载方法中插入额外代码。
控制器本身是不带有参的构造函数的,如果我们为控制器仅仅提供有参的构造函数,就会报错。不过,可以利用DependencyResolver的SetResolver方法,让ASP.NET MVC支持有参的构造函数。
一:领域驱动中的分层 领域驱动设计将软件系统分为四层:基础结构层、领域层、应用层和表现层。 · 基础结构层:该层专为其它各层提供技术框架支持。注意,这部分内容不会涉及任何业务知识。众所周知的数据访问的内容,也被放在了该层当中,因为数据的读写是业务无关的。
一:第一类需求 接口和类定义如下: public interface ISample {} public class Sample : ISample {} public class SomeClass2{} 要求用Unity注入。
如果我们正在使用Session,那么构建高性能可扩展的ASP.NET网站,就必须解决分布式Session的架构,因为单服务器的SESSION处理能力会很快出现性能瓶颈,这类问题也被称之为Session同步。
在网站的开发过程中,经常碰到的一类需求场景是: 1:页面含热点新闻,热点新闻部分需要10分钟更新一次,而整个页面的其它部分1天内都不会变动; 2:首页的某个BANNER需要显式:欢迎***; 上面场景中的1,如果整个页面的缓存失效都定为10分钟,则势必增加性能开销,所以最好的策略是页面的不同部分采用不同的缓存失效时长。
到目前为止,我们讨论了把缓存存放在ASP.NET的输出缓存中(内存和硬盘),以及浏览器缓存中,而大型站点的另一种常用做法是将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存,比如Squid和Varnish。
源码:Luminji.Improve20111018.rar ==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比Parse好 / 12建议5:...
《编写高质量代码:改善C#程序的157个建议》中关于勘误的描述: 资源及勘误 通常情况下,一个问题的解决方案往往不止一种,你可能会不同意本书中的一些观点,甚至会强烈反对。没有关系,你可以通过luminji@hotmail.com(E-mail)与我分享你的宝贵意见,同时也可以在http://www.cnblogs.com/luminji下载书中的源码。
在上篇《ASP.NET性能优化之让浏览器缓存动态网页》中的方案中,浏览器发送If-Modified-Since将是否需要使用自己的缓存交给WEB服务器去决定,服务器告知浏览器去读缓存,浏览器才会去读缓存。
上一篇《ASP.NET性能优化之构建自定义文件缓存》我们通过OutputCache,让请求去访问服务器asp.net的输出缓存,我们扩展了OutputCacheProvider,这相当于是访问服务器上的静态资源。
ASP.NET的输出缓存(即静态HTML)在.NET4.0前一直是基于内存的。这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存。现在,借助于.NET4.0中的OutputCacheProvider,我们可以有多种选择创建自己的缓存。
在实际的项目中,会存在大量的自定义路由,URL很容易被错误的路由捕获,现在我们就实现一个这样的诊断工具,该工具通过实现一个自定义的IHttpModule来实现。 首先,我们创建CustomRouteHandler: public class CustomRouteHandler : IR...
一:压力测试中需要掌握的几个基本概念 1:吞吐率(Requests per second) 服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
首先介绍一下几个基本概念。 一:传输速率 电信号或光信号在进入线路后,能快速传播,其速率,即传播速率。单位是m/s,即米/秒。铜线速度是2.3*10^8m/s,光纤是2.0*10^8m/s。 二:带宽 带宽指的是数据发送速度,具体依赖于总线频率和总线宽度。
1:原理 选择排序是从冒泡排序演化而来的,每一轮比较得出最小的那个值,然后依次和每轮比较的第一个值进行交换。 目的:按从小到大排序。 方法:假设存在数组:72, 54, 59, 30, 31, 78, 2, 77, 82, 72 第一轮依次比较相邻两个元素,将最小的一个元素的索引和值记录下来,然后和第一个元素进行交换。
1:原理 以此比较相邻的两个元素,每次比较完毕最大的一个字跑到本轮的末尾。 目的:按从小到大排序。 方法: 假设存在数组:72, 54, 59, 30, 31, 78, 2, 77, 82, 72 第一轮比较相邻两个元素,如果左边元素大于右边元素,则交换。
递归的C#实现 1:计算数组{1,1,2,3,5,8.......} 第30位值 class Program {staticvoid Main(string[] args) { Console.
http://memcachedproviders.codeplex.com/提供的Memcached客户端支持Asp.net站点中的Session同步,其原理是接管Asp.net的Session处理,同时在后台使用数据库支持完成WEB集群的Session的同步。
Memcached的Windows版本在这里下载http://code.google.com/p/memcached/wiki/PlatformWindows(或http://memcachedproviders.codeplex.com/),最高的版本是1.4.4,但是已经很难在网上下载到。
1:MEF核心概念 可组合的部件(或简称“Part”)— 一个部件向其他部件提供服务,或使用其他部件提供的服务。MEF 中的部件可来自任何位置(应用程序内部或外部);从 MEF 的角度来看,这并无区别。
在MOQ中,It用于添加参数约定,它有以下几个方法: Is:匹配确定的给定类型 IsAny:匹配给定的任何值 IsInRange:匹配给定类型的范围 IsRegex:正则匹配 还是以上文中的例子: public abstract class CounterBase { ...
MOQ来自于http://code.google.com/p/moq/。下载后其实是直接作为DLL被引用的。 Mock是模拟对象的一种技术。 它可以用于以下情况: ----- 真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情) ----- 真实对象很难被创建(比如具体的web容器...
基于以下的理由,ViewModel也是需要多个,并且需要被注入的: 1:设计时和运行时需要为View提供不同的数据 简单来说,就是设计时需要模拟数据。界面设计开发人员需要进行绑定(包括支持Expression Blend绑定)做一些简单的处理,同时因为提供了模拟数据,UI人员可以更好的设计实际的界面。
上篇讲到了3种注入的方式,注入的对象都是由Unity为我们自动创建的。有时候我们需要注入已经存在的对象。 代码如下: //使用已有实例注入 ISomeBiz someBiz = container.
1:本篇基于如下的场景 a:主项目只和接口项目相关,如下: 也即,ConsoleApplication1只和IBiz和IDal相关。顺便说一下,为了演示注入,IDal要用到IBiz项目。 b:类结构如下: SampleClass1,SampleClass2,SampleClass3,都继承自IClass 其中SampleClass1构造器依赖注入ISomeBiz的一个实例, 其中SampleClass2属性依赖注入ISomeBiz的一个实例, 其中SampleClass3方法依赖注入ISomeBiz的一个实例。