八、部署应用
VS7将一个project编译成一个DLL文件,是一个NGWS装配,一个装配可以用在一台机器上,放到
全局Cache,供所有的应用访问,也可以放到某个应用的装配Cache中,只让一个应用访问。
A +允许动态地引用一个类,只需要提供其装配和类名,格式:
a emlyname#cla ame
九、安全
1).认证和授权
除了利用Windows提供的认证服务外,A +还提供了一种服务,使基于 FORM的认证很方便地实现。
它是基于COOKIE工作的,所以客户浏览器必须支持COOKIE。需要注意的是,A +的认证服务是从属于
IIS的认证服务的。
A +提供两种类型的认证服务,一是基于文件的ACL的,另一种是基于URL的。基于URL的培植在
配置文件中。
配置< ecurity>节中的<authenticatio gt;元素,可以有下面几种值:
one:没有认证
Windows:NT的用户/组
Cookie:将未认证的用户转向一个特定的登陆页面。最常用的一种方法。
a ort:必须安装Pa ort服务。
例:
lt;configuratio gt;
lt ecurity>
lt;authentication mode="Cookie"/>
lt;/security>
lt;/configuratio gt;
2).基于Windows的认证
当采用它时,一个Window rincipal对象被附加到Request对象中。程序中可以判定当前用户是否
某类角色,如:
if(User.IsInrole("Administrator quot;))
......
还可以取得用户名,如:
User.Identity.Name;
User.Identity.Type;
3).基于FORM的认证
a).选cookie模式,禁止匿名访问:
lt;authentication mode="Cookie"/>
lt;authorizatio gt;
lt;deny users="?"/>
lt;/authorizatio gt;
).配置登陆页,加密用的键,以及Cookie名字,在<authenticatio gt;的子元素中:
lt;cookie decryptionkey="autogenerate" loginurl="login.a x" cookie=".A XCOOKIESDEMO"/>
注意,loginurl可以是远程机器,但decryptionkey则在两台机器上的必须相同。descryptionkey
设成autogenerate则A +自动选择。但如果一台机器上有多个应用,则最好指定。同时,不同的应用
也该用不同的Cookie名字。因为同一台机器上的所有应用设置的Cookie都将被客户传回来,所以不能同名。
c).提供登陆页
d).验证完后(用你自己的验证机制,比如同数据库中的记录做比较),用下面一行:
CookieAuthentication.RedirectFromLogi age(username,persistence)
返回登陆页前一页。
这一句也设定了Cookie,从而让它之后的A +认证服务认为用户已经经过了认证。
如果不想转向原来的页,而是出现特定的页,比如登陆用户可选菜单页,那必须使用另外的方法,
可以用CookieAuthentication.SetAuthCookie设置好Cookie,用CookieAutentication.GetAuthCookie
来获得Cookie.
另外,上面那行中的第二个参数是一个bool值,表示是否让Cookie永久保存,如果为false的话,
则当用户关闭浏览器后,cookie就消失了。
用CookieAuthentication.SignOut可以清除Cookie,对应用户退出登陆。
除了以上的用程序自己实现认证过程外,也可以用配置文件来实现让A +帮你完成验证。在
<authenticatio gt;节中:
lt;credentials pa wordformat=" HA1" gt;
lt;user name="white" pa word="A F A98527357" gt;
lt;/credential gt;
然后程序调用CookieAuthenticationManager.Authenticate,提供用户名和口令作为参数,就可以
由A +帮你判定用户是否合法了。
加密算法支持 Clear,SHA1,MD5。
4).认证拥护的角色
可以针对用户,也可以针对角色(组),如:
lt;authorizatio gt;
lt;allow users="towhite@263.net"/>
lt;allow roles="Admi quot;/>
lt;deny users="*"/>
多个用户名间用逗号","分割。
还可以细化请求方法:
lt;allow verb=" ost" users="white,saillor"/>
其中,*代表任何人,?代表匿名用户。
十、国际化,本地化应用
A +内部使用UNICODE,NGWS内部基类的String也是用UNICODE。可以支持某种特定的编码,实现转换。
场所属性可以通过CultureInfo类访问,其中,CurrentCulture是同场所有关的函数的缺省值,
而CurrentUICulture是场所上的资源数据格式,例:
lt;%=CultureInfo.CurrentCulture.NativeName %>
lt;%=CultureInfo.currentUICulture.NativeName %>
一些与场所有关的类提供格式化输出,如:
lt;%=DateTime.Now.Format("f",null)%>
lt;%=DateTime.Now.Format("f",new System.Globalization.CultureInfo("de"))%>
可以为某个目录进行配置,如:
lt;configuratio gt;
lt;globalization
fileencoding = "utf-8"
requestencoding = "utf-8"
re o eencoding = "utf-8"
culture = "en-u quot;
uiculture = "de"
/>
或者在Page指令中:
lt;%@ Page Culture ="fr" UICulture = "fr" Re o eEncoding = "utf-8" %>
在页面内部还可以随时更改,使用 Thread.CurrentCulture修改,也就是说,同一个页面可以使用
很多种编码输出。
1).设置文化和编码
中文的Culture应设为:zh-cn
CultureInfo.CurrentCulture.Name = "zh-c quot
CultureInfo.CurrentCulture.EnglishName = "Chinese(Peoples' Republic of China"
CultureInfo.CurrentCulture.NativeName = "中文(简体)(中华人民共和国)"
另外,类RegionInfo还提供地域信息:
RegionInfo.CurrentRegion.NativeName = "中华人民共和国"
RegionInfo.CurrentRegion.CurrencySymbol = "¥"
2).本地化A +应用
3).使用资源文件
GWS基类支持,运行时有个类叫ResourceManager的实例可以使用。可以用ResourceWriter或者实用
工具resgen.exe来生成资源文件,resgen以 key = value 的形式作为输入,如:
注释
[Strings]
greetings = 欢迎你!
more = 更多新闻
资源文件的后缀为.resources。
如何在页面中使用资源文件?
用户的Content-Language可以用Request.UserLanguages[0]来取得。
如何实现多语言支持?
a).准备资源文件,生成.resources文件,文件取名规则:中间带Culture名。例:articles.en-us.resources
).global.asax中取得一个ResourceManager,并放如A lication中供整个A lication使用
c).global.asax中为A lication_BeginRequest事件写代码,根据客户的情况决定当前的Culture.
d).在页面中用ResourceManager.GetString取得内容。
例:
//global.asax中:
void A lication_O tart(){
A lication["RM"]=new ResourceManager("article quot;,Server.Ma ath("resource quot;)
+Enviroment.DirectorySeparatorChar,null);
}
void A lication_BeginRequest(Object sender,EventArgs e){
try {
Thread.CurrentThread.CurrentCulture = new
CultureInfo(Request.UserLanguages[0]);
}catch(ArgumentException){
Thread.CurrentThread.CurrentCulture=new CultureInfo("en-u quot;);
}
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
//default.asax中:
ResourceManager rm;
void Page_Init(Object sender,EventArgs e){
rm=(ResouceManager)A lication["RM"];
}
//输出内容时:
lt;%= rm.GetString("greeting quot;) %>
an>


