位置:海鸟网 > IT > ASP.NET >

搭建系统框架发现的三个Web.Config问题

--------------------------------<特别声明,此文档是转载,黄勇BLOG的文章>-----------------------------------
搭建系统框架发现的三个Web.Config问题

按照微软的Duwamish7搭建一个Web系统框架,虽然说是一个现成的框架在旁边,却还是遇到一些烦人的小问题,其中有好几个就是这个Web.Config搞的鬼!
1。搭建好的系统框架运行出错,报什么不能正确读取ApplicationConfiguration配置节,但我的配置节部份完全是从Duwamish7中Copy过来,而且昨天还好好的啊?也不记得弄了多久,试了多少次自己也都觉得不可能的方法,都无功而返。最后,看着它发呆,一筹莫展时,一个念头闪过:ApplicationConfiguration?是不是太多了。改成AppCofiguration,再试,天啊!竟然成功了!晕!
<configSections>
<section name="AppConfiguration" type="AVWeb.SystemFramework.ApplicationConfiguration, AVWeb.SystemFramework" />
</< SPAN>configSections>
2。也是运行报Web.Config某注释行出错,注释如下:
-- Database type 0--Access 1--SqlServer -->
因为对这个不太熟悉,也是弄了很久才知道:<!-- -->中包含的注释不能包含有"--"字符
3.想在页面上调用Javascript写的一个日历控件,其中有中文注释,把js文件包括在页面中,但一运行,怎么也不能正常装载,老是报“未结束的字符串常量”等错误,弄了半天之后,才明白是字符集搞的鬼!
Web.Config文件中配置的字符集非常重要,也就是这个:<globalization responseEncoding="gb2312" requestEncoding="gb2312" />
如果程序中有中文,但Encoding又不是gb2312的话,可能很多莫名其妙的问题就来了!
Duwamish7学习笔记(二)
SystemFrameWork项目
  SystemFrameWork项目是一个能直接移植到别的应该程序的项目,可以不修改或很少的修改代码而直接使用。
  项目主要为3个类。
1.ApplicationConfiguration类
此类为应用级的配置类,实现IConfigurationSectionHandler接口。与前面讲的DuwamishConfiguration类实现方法类同。主要方法为Create(),OnApplicationStart(),ReadSetting()。
如果要使用此类,需于Global.asax的Application_OnStart事件中调用 ApplicationConfiguration.OnApplicationStart(Context);
public static void OnApplicationStart(String myAppPath)
{
appRoot = myAppPath;
System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration");
System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration");
System.Configuration.ConfigurationSettings.GetConfig("SourceViewer");
}
此方法通用调用ConfigurationSettingis.GetConfig()方法通过Web.Config中的取得对应的解析类,调用相应的Create()方法。如果没有对应的配置解析类则可直接调用System.Configuration.NameValueSectionHandler类解析,GetConfig("SourceViewer")即是如此。
2.ApplicationAssert类
此类主要用来帮忙开发人员进行错误检查,日志记录等。主要有Check(),CheckCondition(),GenerateStackTrace()三方法和LineNumber属性。
[ConditionalAttribute("DEBUG")]应用于Check(),和GenerateStackTrace()方法,如果Debug常量被定义,此方法可以被调用。
3.ApplicationLog类
此类主要用来进行日志记录。
定义Error(1)、Warning(2)、Info(3)、Verbose(4)四个TraceLevel级别记录日志调试和跟踪信息.具体设置于Web.Config的配置节中定义。此类中所有方法均为static方法,是主要的为static void WriteLog(level,messageText)
如果写入的TraceLevel不大于配置中定义的级别,则把对应的调试、跟踪信息按定义的级别写入Windows 事件日志中和定义的跟踪文件中.
ApplicationLog类的构造函数声明为private static,在对ApplicationLog类进行第一次调用时从配置文件中取得配置信息进行初始化。

疑问:
1.在 static ApplicationLog()中运用了System.Threading.Monitor,保证多线程操作的安全性。为什么对ApplicationLog要进行锁的控制?
2.对System.Diagnostics命名空间中某些类理解不太清楚。
MSDN帮助:
1.Monitor 类
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemthreadingmonitorclasstopic.htm
2.System.Diagnostics 命名空间(提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互)
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemdiagnostics.htm
posted on Friday, December 17, 2004 11:27 AM
Duwamish7学习笔记(三)
DataAccess项目
DataAccess项目中共4个类:Books类,Categories类,Customers类,Orders类.均实现了IDisposable接口。用来关闭活动的数据库连接。
这是MS提倡的一种释放非托管资源的Dispose模式。有关Dispose模式《.NET框架程序设计(修订本)》的19章“自动内存管理(垃圾收集)”有精采的论述.
  类中通过调用存储过程,封装了对4个业务对象的Select,Insert,Update操作。
  Select操作通过SqlDataAdapter的Fill方法填充对应的继承自DataSet的业务实体类,返回给调用者。Books类和Categories类只有Select操作.
 Insert和Update操作通过一个private 函数返回InsertCommand或UpdateCommand对象。再于对外的的Public函数调用Private内部函数完成相应操作。Customers类中实现Insert,Update,Select操作,Orders类只有Insert操作。
在Customers类的LoadCustomerByEmail()方法中有对ApplicationAssert类的CheckCondition()方法调用
ApplicationAssert.CheckCondition(data.Tables[CustomerData.CUSTOMERS_TABLE].Rows.Count <= 1, "Integrity Failure: non-unique e-mail address", ApplicationAssert.LineNumber);
疑问:
1.数据访问层感觉实现了业务逻辑层的内容,平时如LoadCustomerByEmail()等方法都是写在业务逻辑层的。
2.是否有必要抽象出一个完全对数据库操作的基类,实现对数据库底层的操作?而不是在每个类如:Books,Customers中均一次次重写如SqlCommand对象,Dispose模式?
Duwamish7学习笔记(四)
BusinessRules项目
1.Customer类
长见识了!在《Duwamish7学习笔记(三)》中还在想业务逻辑层写些什么东西。
校验,还是校验!每一行,每一列,包括类型和长度,想想自已在项目的校验,真的有点汗颜!
//----------------------------------------------------------------
// Function Validate:
// Validates and customer
// Returns:
// true if validation is successful
// false if invalid fields exist
// Parameters:
// [in] customerRow: CustomerData to be validated
// [out] customerRow: Returns customer data. If there are fields
// that contain errors they are individually marked.
//----------------------------------------------------------------
private bool Validate(DataRow customerRow)
{
bool isValid;

customerRow.ClearErrors();

isValid = IsValidEmail(customerRow);
isValid &= IsValidField(customerRow, CustomerData.NAME_FIELD, 40);
isValid &= IsValidField(customerRow, CustomerData.ADDRESS_FIELD, 255);
isValid &= IsValidField(customerRow, CustomerData.COUNTRY_FIELD, 40);
isValid &= IsValidField(customerRow, CustomerData.PHONE_FIELD, 30);

if ( !isValid )
{
customerRow.RowError = CustomerData.INVALID_FIELDS;
}

return isValid;
}
全部校验通过之后才调用业务访问层的相应方法进行操作,用using,使创建的Customers使用后能马上释放。
using (Customers customersAccess = new Customers())
{
result = customersAccess.UpdateCustomer(customer);
}
下面记录一点小知识
设置行错误:row.RowError
设置列错误:row.SetColumnError()
清除行错误:row.ClearErrors()
邮件校验的正则表达式:REGEXP_ISVALIDEMAIL = @"^\w+((-\w+)|(\.\w+))*\@\w+((\.

2.Order类
看完Order类觉得这各层的分工非常好,这层才是真正的业务如CalculateTax(),CalculateShipping(),InsertOrder().??? 业务逻辑层在封装业务操作方法时,进行了非常严格的校验,使系统有非常强健的健壮性。叹为观止!

疑问:Duwamish只是MS自带的一个小例子,在实际的大的项目中有非常多的对象,非常且更复杂的业务逻辑,我们的代码还能写得于此之好吗?
Duwamish7学习笔记(五)
BusinessFacade项目
业务外观层封装了3个类CustomerSystem,OrderSystem,ProductSystem,类中直接调用数据访问层和业务逻辑层类的方法与属性提供对Web层的接口。有意思是的每个类结尾均以System命名。客户系统?订单系统?产品系统?
 业务外观层中3个类均继承自MarshalByRefObject类,来支持远程处理。MSDN中关于MarshalByRefObject类的解释为:
“允许在支持远程处理的应用程序中跨应用程序域边界访问对象。”
“应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通讯。不同应用程序域中 的对象的通讯方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。”
“MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通讯的对象的基类。不是从 MarshalByRefObject 继承 的对象根据值隐式封送。当远程应用程序引用根据值封送的对象时,将跨应用程序域边界传递该对象的副本。”
“MarshalByRefObject 对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问 MarshalByRefObject 时, 会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。”
“当跨应用程序域边界使用类型时,类型必须是从 MarshalByRefObject 继承的,而且由于对象的成员在创建它们的应用程序域之外 无法使用,所以不得复制对象的状态。”
CustomerSystem类中有对密码通过.NET内置的加密支持进行密码保护的代码,可以很方便的用到我们平时的项目之中。
疑问:
  1.类结尾命名为System,怎么解释?
2.类均标记为从MarshalByRefObject类继承,来支持应用程序中跨应用程序域边界的对象访问,系统在什么情况下将会进行“跨应用程序域边界访问对象”?
3.Common项目中的所有类均标记为[SerializableAttribute],标记为[SerializableAttribute]和继承自MarshalByRefObject类均可用来支持远程调用,两者有何区别?
4.感觉抽象出业务外观层加大了系统的复杂程度,加大了编码量。
Duwamish7学习笔记(六)
Web项目
Web项目为Duwamish系统的业务展示层,为客户提供对应用程序的访问界面。
1.PageBase.cs为每个页面的基类,主要是获取页面的URL信息,从Session中获取或设置Customer和Cart信息,另外重写了Web.UI.Page的OnError()事件。捕获页面错误,调用ApplicationLog.WriteError()方法写入日志。
2.ModualBase.cs为系统中每个用户控件的基类,本身继承自UserControl,功能基本同PageBase.cs,用到了Session保存Customer与Cart信息.
3.Cart.cs(购物车)类中封装了所有对购物车的方法与属性。Cart类实现了ISerializable接口对OrderData对象进行序列化与反序列化。
4.Default.aspx页面没有具体很多代码,只是控件的组合。Default.aspx页面的EnableSessionState=true
5.BannerModule.ascx中所有控件的EnableViewState均设置为False,其实也可以直接在控件上设置EnableViewState=false,用户控件没有
EnableSessionState属性.BannerModule数据几乎很少改动,所以启用了缓存,在控件顶部加入代码:
“<%@ OutputCache Duration="3600" VaryByParam="none" VaryByControl="BannerModule.PathPrefix" %>”
Duration表示缓存时间为60分钟。VaryByParam="none"表示不据参数值而改变输出缓存,VaryByControl表示据每个请求的PathPrefix来
进行输出缓存。注意 :如果在指令中使用了 VaryByControl 属性,则不需要包括 VaryByParam 属性。
6.SearchModule.ascx用来进行书籍查询的模块,代码很简单,重定位的那段代码觉得写得很美观:)
Response.Redirect((new StringBuilder(PageBase.UrlBase))
.Append("/searchresults.aspx?type=")
.Append(index)
.Append("&fullType=")
.Append(Server.HtmlEncode(SearchDropDownList.Items[index].Text))
.Append("&text=")
.Append(Server.UrlEncode(searchText)).ToString(), false);
就这么几个字符串连接,都用了一个SringBuilder,还有Server.HtmlEncode(),Server.UrlEncode()方法的调用,减少不必要的麻烦。
7.SearchResult.aspx:查询结果显示页面。因为查询页面不要用到Customer和Order信息,所以页面的EnableSessionState设置为false,
EnableViewState也设置为flase.
在Page_Load()事件中取得传入的参数,生成查询结果.有段代码如下:
if (IsPostBack)
{
//
// Avoid a refresh problem if the user has left the search
// string empty by rerunning last search.
//
if ( ((TextBox)ModuleSearch.FindControl("SearchTextBox")).Text.Trim() != String.Empty )
{
return;
}
}
//Other Code
可不可以直接把Other Code放入if(!IsPostBack){}中来“Avoid a refresh problem”?
8. CategoriesModule.ascx:分类信息展示模块,因为Categories信息很少变化,把数据库中取得的分类信息保存到Cache中,设置
  失效时间为60分钟之后。
9.AccountModule.ascx:创建或编辑用户账户,创建或编辑的客户保存在Session中,方便快速的获取和更新.
创建新的客户信息中密码的保存经过了层层加密。
a.用户的密码与确认密码均一致
b.通过sha1.ComuteHash计算输入密码的哈希值
c.得到的哈希值再与利用RNGCryptoServiceProvider生成长度为4的加密随机数合并生成新的字节数组
d.新的字节数组再计算新的哈希值并
e.再次加入原加密随机数,从而得到保存于数据库的加密密码。
登陆时
a.取得用户电子邮箱哈希值
b.取得用户保存于数据库中加密密码
c.取得原后4位随机加密值
d.像加密时一般,重新与当前用户输入电子邮箱哈希值进行哈希计算
e.得到的哈希值与保存于数据库中的加密密码一一对比,得到结果
哈希备注:哈希函数是现代密码系统的基础。这些函数将任意长度的二进制字符串映射为固定长度的小二进制字符串(称为哈希值)。
加密哈希函数有这样一个属性:在计算时不可能将两个不同的输入通过哈希算法取为相同的值。哈希函数通常用于数字签名和保持数据完整性。
   哈希值用作表示大量数据的固定大小的唯一值。如果相应的数据也匹配,则两个数据集的哈希应该匹配。
  数据的少量更改会在哈希值中产生不可预知的大量更改。
  10.viewSourceModule.ascx:查看源代码的用户控件。与之相关的还有ViewSource.aspx页面和不包含于项目之中的
Docs文件夹和每个页面或控件对应的扩展名为.src的文件,来实现程序运行时查看本身的实现代码。
ViewSourceModule用户控件也启用了缓存声明如下:
“<%@ OutputCache Duration="3600" VaryByParam="none" VaryByControl="BannerModule.PathPrefix" %>”
MSDN帮助:
 1.页面缓存和用户控件缓存
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcachingmultipleversionsofpageorcontroloutput.htm
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcachingmultipleversionsofusercontroloutput.htm
2.PageBase基类和ModuleBase基类均用到了Session,为什么不用Cache?两种有何区别和各自的优势?

疑问:1.查询重定向时用到Server.HtmlEncode()和Server.UrlEncode(),这两者编码方法有何区别?此处是否可以均用UrlEncode()?
2.放到页面展示的内容均进行HtmlEncode()编码。
3.DailyPickModule.ascx中有对应用中EnablePageCache配置的获取
if (DuwamishConfiguration.EnablePageCache)
{
//Enable Page Caching...
Response.Cache.SetExpires ( DateTime.Now.AddSeconds(DuwamishConfiguration.PageCacheExpiresInSeconds));
Response.Cache.SetCacheability(HttpCacheability.Public);
}
不明白,在BannerModule.ascx,CategoriesModule.ascx有对Cache的操作,在这两个地方为什么不需要进行判断?
另外,在此设置的Enable或Disable页面Cache信息对BannerModule和CategoriesModule中的Cache操作与设置有没有影响??
posted on Wednesday, December 22, 2004 4:09 PM
Feedback
# texas hold em 3/18/2005 6:45 PM texas hold em
Please check some helpful info dedicated to party poker
online poker
texas hold em
texas holdem
poker games
free texas hold em
how to play poker
poker online
texas holdem poker
wsop
pacific poker
poker
texas holdem
poker tables
poker rules
free poker
poker hands
world series of poker
free online poker
empire poker
world poker tour
party poker
poker games
free texas hold em
how to play poker
texas holdem poker
pacific poker
empire poker
world poker tour
free online poker
world series of poker
poker hands
poker tables
poker rules
online poker
...
# party poker 3/18/2005 6:52 PM party poker
You may find it interesting to check the pages in the field of party poker
online poker
texas hold em
texas holdem
poker games
free texas hold em
how to play poker
poker online
wsop
pacific poker
poker
texas holdem
poker tables
poker rules
free poker
poker hands
world series of poker
free online poker
empire poker
world poker tour
party poker
poker games
free texas hold em
how to play poker
wsop
pacific poker
free online poker
world series of poker
free poker
poker hands
texas hold em
poker tables
poker rules
poker
online poker
- Tons of interesdting stuff!!!
# phentermine 3/21/2005 6:05 AM phentermine
In your free time, check some information dedicated to buy phentermine
phentermine
slot machines
blackjack
online casino
casino
phentermine diet pills
online diet pills
order viagra
phentermine cheap
discount viagra
tramadol
tramadol online
online levitra
reductill
xanax
carisoprodol
generic viagra
buy viagra
buy phentermine online
cialis
viagra
casino bonus
betting
slots
craps
casino games
video poker
casinos
online casinos
slot
roulette
black jack
gambling
internet gambling
...
# buy phentermine 3/21/2005 6:12 AM buy phentermine
Please check some relevant pages about buy phentermine
phentermine
slot machines
blackjack
online casino
casino
phentermine diet pills
online diet pills
buy cialis
best price viagra
phentermine cheap
discount viagra
tramadol
tramadol online
online levitra
reductill
xanax
carisoprodol
generic viagra
buy viagra
cialis
casino bonus
diet pills
betting
slots
craps
casino games
video poker
casinos
slot
roulette
black jack
gambling
keno
internet gambling
- Tons of interesdting stuff!!!
# phentermine 3/23/2005 3:02 AM phentermine
Please visit some information dedicated to online pharmacy
diet pills
phentermine
buy phentermine online
herbal viagra
canada pharmacy
phentermine online
cheap phentermine
didrex
online pharmacies
canadian pharmacies
cheap viagra
canadian pharmacy
propecia
generic viagra
meridia
ultram
soma
prozac
xanax
tramadol
cialis
viagra
buy xanax online
buy xanax
buy viagra online
buy viagra
buy tramadol
buy soma
buy phentermine
buy diet pills
buy cialis
buy bontril
buy ambien online
buy ambien

Duwamish7学习笔记(七)
总结:
终于把Duwamish六个项目均较仔细的学习了一遍,感觉还是收获颇多!:)看大师出手的代码,真如品一杯美味香浓的咖啡,那种感觉真的好极了,让人赞不绝口。
1.代码写得非常简练、工整。
2.代码注释写得非常清楚、到位。
3.系统结构非常好,校验、控制写得非常的严格,使系统具有非常好的健壮性、安全性、可扩展性。
4.系统中异常处理控制得很好,不像平常我们的项目中,try,catch,散乱的随处可见。
5.系统充份利用Web.Config,进行配置,使系统可很方便、灵活的配置更改,而不用改动代码。
6.系统对View、Session和Cache的充份利用,使系统也有着很好的性能。
7.系统充份利用用户控件,继承等页向对象技术,使代码有着较好的可重用性。
虽然因为自已水平有限,还没足够深入,还没有完全理解,虽然花了好几天的时间,但是我还是想说一个字--值!
BTW:其实这是我第二次看Duwamisn7,大概是一年前就看过知道这个MS经典的例子,但记得当时看得不是太懂,当时就想先且放下,等自已有一定的DotNET基础后再来学习,实践过几个项目的今天再来看此例子觉得好理解多了:)
写完学习笔记,再看MSDN中有关Duwamish7的资料,又郁焖了,还是有太多的东西不太理解!如远程处理,分布式部署等等。如是我又对自已说:先放下吧,等再过一年,再来学习,再来研究,一定会有新的领悟,新的理解!学习就是这样,它是个渐进的过程,它不可能一蹲而就。当然如果不是时隔一年,而是半年,那就是自已飞速的进步了:)