Asp.Net MVC温故而知新【1】-添加控制器

This is post 1 of 14 in the series “Asp.Net MVC温故而知新” Asp.Net MVC温故而知新【1】-添加控制器 Asp.Net MVC温故而知新【2】-添加视图 Asp.Net MVC温故而知新【3】- 修改视图和布局页 Asp.Net MVC温故而知新【4】- 控制器传递数据给视图 Asp.Net MVC温故而知新【5】- 添加模型 Asp.Net MVC温故而知新【6】- 创建连接字符串 Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据 Asp.Net MVC温故而知新【8】- 生成的代码详解 Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解 Asp.Net MVC温故而知新【11】- 添加查询 Asp.Net MVC温故而知新【12】- 数据迁移之添加字段 Asp.Net MVC温故而知新【13】- 添加验证 Asp.Net MVC温故而知新【14】- Details 和… Continue reading Asp.Net MVC温故而知新【1】-添加控制器

当ASP.NET发生Viewstate MAC的验证失败(machineKey)

问题是这样的,当 ASP.NET 因为网页还没全部下载完成时,使用者就按下网页中的任意一个PostBack 的按钮或链接时,就会发生「Viewstate MAC 的验证失败」的错误讯息! 这问题实在很难除错(DEBUG),我想很多人连发生的原因都不知道,主要的发生原因有两种: 1. 当网站采用 Web-farm 架构时,也就是一个网站采用负载平衡的架构,用多台 Web 主机同时提供服务时。 因为 ASP.NET 预设会将 Viewstate 编码加密,验证数据的加密类型是 SHA1,验证加密数据的密钥(Key)预设是「自动产生」,所以每一台Web主机所产生的Key都不一样,所以你采用多台主机同时提供服务时,就可能会遇到从第一台Web主机读到的内容,做 PostBack 时可能会 PostBack 到第二台主机,但第二台主机看不懂第一台主机编码过的 Viewstate,而导致「Viewstate MAC 的验证失败」的例外发生! 这时你需要统一每一台主机的 machineKey 才能让每一台的编码加密的内容可以被正确验证!建议您去 The Code Project 网站看这份文件:ASP.NET machineKey Generator 上面有完整说明! 2. 因为网页还没全部下载完成,导致页面的状态不完整时就对服务器发出 PostBack 要求,因为 ViewState 不完整,而导致 Viewstate 验证失败。 这个问题只能将修改网站的 web.config 设定将 Viewstate 全部关闭才不会发生错误!如下: <pages enableEventValidation=”false” viewStateEncryptionMode =”Never” enableViewStateMac=”false”/>

.NET中如何使用嵌入的资源

.Net中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。下面分别详述这两种方法: 使用GetManifestResourceStream读取嵌入资源 加入资源文件 直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的根目录,可以加在项目的任何目录中。 设置资源文件的“BuildAction”属性 将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource” 代码中使用嵌入资源 //获得正在运行类所在的名称空间 Type type = MethodBase.GetCurrentMethod().DeclaringType; string _namespace = type.Namespace; //获得当前运行的Assembly Assembly _assembly = Assembly.GetExecutingAssembly(); //根据名称空间和文件名生成资源名称 string resourceName = _namespace + “.directory.BitmapManifest.bmp”; //根据资源名称从Assembly中获取此资源的Stream Stream stream = _assembly.GetManifestResourceStream(resourceName); Image myImage = Image.FromStream(stream); 上述代码中有部分步骤是为了获得resourceName的值,resourceName的值结构形式类似于:”命名空间.目录路径.文件名+后缀” 此外还有一种访问资源的格式:”assembly://SpringSample/Sample.Spring/Resources.BitmapManifest.bmp”,有点像URI格式,不同的是协议为”assembly://”,”SpringSample”为程序集名称,”Sample.Spring”为默认命名空间,”Resources”为目录路径。注意:程序集名称与默认命名空间之间、默认命名空间与目录路径之间用”/”分隔,目录路径与文件名之间用”.”分隔,因为如此我们理解了访问资源的路径方式,就可以直接进行引用了。 使用. resx资源文件嵌入资源 新建资源文件 在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。 其实资源文件最大的用处是用来做多语言版本的软件时保存不同语言的资源,比如不同语言的菜单文本,可以把不同语言的字符串放在同一个资源类型下的不同资源包中,程序运行时根据运行时系统的culture选择不同的包显示不同语言的字符串。 新建了资源文件后就能往资源文件中添加资源文件: 资源中可以添加字符串、位图、图标、音频、文件等等的资源。 添加的资源都会被保存在项目的Resources文件夹中。 设置资源文件的“BuildAction”属性 Resources文件夹中的所有资源文件的“BuildAction”属性设置为“Embedded Resource”。 资源存在方式 .resx资源文件管理的资源可以用两种存在形式,一种是以一般的文件形式存在于Resources文件夹中,另一个是经过Base64编码后嵌入到.resx资源文件中。 打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是一样的。… Continue reading .NET中如何使用嵌入的资源

ASP.NET ViewState初探

话说在新公司上班快2周了,这里的工作和业务还是有些意思和挑战的。这几天1直在重构公司之前的一个项目,出于保密协议这里不能提项目名称,作为对新人的关爱,我仅负责其中1个模块的1个页面,这个页面的性能有些问题,当大批量进行数据修改的时候,提交和响应会非常的慢,我需要做的是就是改善它的性能。 花了一天时间分析了这个页面的有关代码,实在很头痛,大量的服务端控件、大量的事件、大量的重复代码,发现问题的关键在于该页大量的服务端控件(GridView嵌套大量DropDownList、TextBox、CheckBox)及大量的迭代查询。 于是狠心下来进行重构,越深入发现问题越多,根本无法重构,除非整个模块和某些底层推倒重来,但是工时将纠人心窝(明早开会把情况说明PM估计要跳的了)。 这个项目通过微软传统的WebForm Code Behind编程模型,大量使用事件和服务端控件,说到服务端控件,有个很重要的属性EnableViewState,它保持着页面回转的状态,借这次Code Review的机会,将Asp.Net ViewState进行一次复习。 ASP.NET ViewState 初探 ViewState 到底是什么 与刚接触 ASP.NET 页面的开发人员交谈时,他们通常向我提出的第一个问题就是:“那个 ViewState 到底是什么?”他们的语气中流露出的那种感觉,就象我来到一家异国情调的餐馆,侍者端上一道我从未见过的菜肴时的那种感觉 —— 既疑惑不解,又充满好奇。但肯定有人认为它不错,否则就不会提供了。所以,我会先尝一尝,或许会喜欢上它,尽管它看上去的确很古怪! 对于 ViewState 也是如此,但是如果适应了它的风格,您会发现在许多情况下,您将乐于在自己的 ASP.NET 应用程序中使用 ViewState,因为它可以帮助您使用更少的代码完成更多的工作。但是,有时也会对 ViewState 完全弃之不用。下面我们就这两种情况分别进行阐述,不过,让我们先回答什么是 ViewState 这个问题。 答案:ViewState 用于维护页面的 UI 状态 Web 是没有状态的,ASP.NET 页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。作为 Web 开发人员,您可以使用众所周知的技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。下面我们以图 1 中的注册窗体为例进行论述。

多线程应用中使用静态方法是否有线程安全问题

类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。 简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。 我们知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。 那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。 因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。 静态变量前加volitile,静态函数里面使用Lock控制线程安全。 对于ASP.NET Web应用程序, 多个客户端访问服务端, 就是一个多线程的例子。

在.Net中检查Sql注入

SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行。任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询。一个有经验的、坚定的攻击者甚至可以操作参数化数据。 SQL 注入的主要形式包括直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。 注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“–”来终止注入的字符串。执行时,此后的文本将被忽略。

简要的Web缓存技术

最近在做1个项目,名叫《智慧街区》。简单进行1下项目介绍:与政府有关部门进行合作,将自助终端(其实就是1台PC机,只不过长的好看点)竖立在大街小巷,为市民提供各色服务,比如:公交、天气、商家、优惠、政策、新闻等等1些便民功能。 这样1个项目,按道理来说,是应该做成CS结构的,这样便于对终端设备上有关硬软件的控制,但无耐的是项目时间较短、用户体验要好,我们只能选择偷梁换柱,使用BS方式(C端编写1全屏置顶的小程序,嵌套web网站)来解决。 调研阶段,我们了解到该项目功能并不复杂,手上也有比较好的原型和模块代码,我们所需要解决的问题主要有2个:1是客户端缓存,因为终端是使用3G无线传输,速度和流量得不到保障,速度<200KB,按流量收费,我们只能在服务端有更新内容的时候,客户端才能更新有关数据,最大限度的节约带宽;2是控制客户端打印,因为使用JS控制打印机会弹出打印对话框的,而终端设备上我们是不允许用户进行这种操作的。 今天先说第1个问题,客户端缓存的问题,这方面我特别g了1下,也算了解到1些比较简洁比较有效的技术,当然以前也都或多或少的接触过。下面这篇文章不错,遂载,明天还有1篇文章会描述《Web缓存技术概述》。 这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中。为了简要起见,某些实现方面的细节被简化或省略了。如果你更关心细节实现则完全不必耐心看完本文,后面参考文档和更多深入阅读部分可能是你更需要的内容。 目录: 什么是Web缓存,为什么要使用它? 缓存的类型: 浏览器缓存; 代理服务器缓存; Web缓存无害吗?为什么要鼓励缓存? Web缓存如何工作: 如何控制(控制不)缓存: HTML Meta标签 vs. HTTP头信息; Pragma HTTP头信息(为什么不起作用); 使用Expires(过期时间)HTTP头信息控制保鲜期; Cache-Control(缓存控制) HTTP头信息; 校验参数和校验; 创建利于缓存网站的窍门; 编写利于缓存的脚本; 常见问题解答; 缓存机制的实现:Web服务器端配置; 缓存机制的实现:服务器端脚本; 1.什么是Web缓存,为什么要使用它? Web缓存位于Web服务器之间(1个或多个,内容源服务器)和客户端之间(1个或多个):缓存会根据进来的请求保存输出内容的副本,例如html 页面, 图片,文件(统称为副本),然后,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。 使用缓存主要有2大理由: 减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快; 减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。 2.缓存的类型 浏览器缓存 对于新一代的Web浏览器来说(例如:IE,Firefox):一般都能在设置对话框中发现关于缓存的设置,通过在你的电脑上僻处一块硬盘空间用于存储你已经看过的网站的副本。浏览器缓存根据非常简单的规则进行工作:在同一个会话过程中(在当前浏览器没有被关闭之前)会检查一次并确定缓存的副本足够新。这个 缓存对于用户点击“后退”或者点击刚访问过的链接特别有用,如果你浏览过程中访问到同一个图片,这些图片可以从浏览器缓存中调出而即时显现。 代理服务器缓存 Web代理服务器使用同样的缓存原理,只是规模更大。代理服务器群为成百上千用户服务使用同样的机制;大公司和ISP经常在他们的防火墙上架设代理缓存或者单独的缓存设备; 由 于带路服务器缓存并非客户端或者源服务器的一部分,而是位于原网络之外,请求必须路由到他们才能起作用。一个方法是手工设置你的浏览器:告诉浏览器使用 那个代理,另外一个是通过中间服务器:这个中间服务器处理所有的web请求,并将请求转发到后台网络,而用户不必配置代理,甚至不必知道代理的存在; 代理服务器缓存:是一个共享缓存,不只为一个用户服务,经常为大量用户使用,因此在减少相应时间和带宽使用方面很有效:因为同一个副本会被重用多次。 网关缓存 也被称为反向代理缓存或间接代理缓存,网关缓存也是一个中间服务器,和内网管理员部署缓存用于节省带宽不同:网关缓存一般是网站管理员自己部署:让他们的网站更容易扩展并获得更好的性能; 请求有几种方法被路由到网关缓存服务器上:其中典型的是让用一台或多台负载均衡服务器从客户端看上去是源服务器; 网络内容发布商  (Content delivery networks CDNs)分布网关缓存到整个(或部分)互联网上,并出售缓存服务给需要的网站,Speedera和Akamai就是典型的网络内容发布商(下文简称CDN)。 本问主要关注于浏览器和代理缓存,当然,有些信息对于网关缓存也同样有效; 3.Web缓存无害吗?为什么要鼓励缓存?… Continue reading 简要的Web缓存技术

比较使用Linq To Entity、自已编写ORM映射、以及使用缓存保存常用数据之间的性能

第1步 建立数据库 首先我们模拟1个需求环境:会员参加活动,生成活动记录,会员有性别、所属区域字段。 第1步,建立Sql Server数据库,Members表保存成员的基本信息,其中SexId、AreaId为外键,分别关联Sex性别表、Areas区域表;Activitys表保存活动的标题;ActivityRecords表保存成员参加活动的记录,其中MemberId、ActivityId为外键,分别关联Members成员表、Activitys活动表。 下面是创建表结构的Sql语句:

回顾1些在项目管理中遇到的问题和解决方式

从事软件开发很长很长1段时间了,除去在校时光,正式进行社会工作也已经4年光景了。记得最初的时候,我还是使用ASP,那会儿asp还很流行,.net framework1.1才出来不久,那会儿是2003年吧;那会儿你要既会vbscript也要会javascript;那会儿你要既会css也要会html4;那会儿你要既懂vb.net 2003,也要懂c++;总之那会儿,我接触到了很多语言、思想之类的东西。 工作4年了,大小遇到过的项目也有三四十个了吧,由于1直以来,从踏入社会的那1刻就从事项目管理和开发的工作,所以在实践的道路上遇到过很多问题,通常是通过自己翻阅资料,以及寻求互联网帮助来解决,现在也慢慢的喜欢上这种方法。 现在把1些近期项目中遇到的问题记录如下,另外也附带了自己当时的处理方法和思路: 1.信息的不对称和不及时,这个问题是所有问题的根源。打个比方,进入某个迭代的产品测试环节,产品告诉美术根据客户需求,需要将新闻和公告互换位置,美术将更改后的效果图发送至项目经理和产品进行确认,项目经理可能还不知道这样1件事,项目经理、产品、客户确认过后,美术将效果图发送至前端,前端可能还不知所以然,问:“这是什么呀?”,然后美术又需要将修改的地方告诉前端。 这种信息的不对称和不及时,在项目的开发过程中,会浪费很多时间和工作量,我们应该使用1种网络软件管理或电邮等方式,要让所有项目组的人及时清楚,以及明确各自的责任。这个环节我目前使用的是zentao来进行管理。