五、ASP+ MyWeb 應用
1).概述
MyWeb是ASP+中的一門新技術,允許一個ASP+應用在沒有WEB服務器的機器上運行,實際在
IE內部運行,可以離線地運行。開發上與服務器端的應用開發無異。
讓客戶可以在需要時進行安裝,這叫demand install。
當用戶訪問一個MYWEB應用時,ASP+首先試圖從本地找到這個應用,如果找不到,則從
myweb:URL處下載應用說明(manifest),如果成功,則下載整個應用並安裝到本地。
myweb在NGWS運行環境中執行(所以,客戶端必須安裝NGWS運行時庫),可以訪問獨立的
存儲系統,同時,可以建立到原來安裝這個應用的站點的連接。他們不能訪問本地機上的資源,
以及部分COM的調用(這有點類似於Java中的APPLET)。
2).myweb管理工具
如果安裝了IE55,並且安裝了NGWS運行時環境,則可以從浏覽器工具條上選擇"myweb"按扭,
(位置在工具條的最後,就像安裝了金山詞霸後增加的那個工具一樣),或者也可以直接在浏覽
器的地址欄裡輸入 myweb:// ,就可以進入MYWEB管理工具。
存在兩種類型的myweb應用,一是Remote的,二是Local的。
可以用管理工具新安裝一個myweb應用,或者直接從浏覽器地址欄裡輸入myweb的URL,後一
種情況下,如果已經安裝了這個myweb應用,則將直接啟動該應用。
3).開發myweb應用
跟開發一個ASP+服務器應用類似,最後需要一個CAB文件,用實用工具cabarc.exe生成,如:
cabarc -p -r n myweb.cab *.ASPx *.Html *.jpg *.CSS *.dll *.web
manifest文件是OSD(Open Software Description)格式,名為myweb.osd,一個例子:
<soFTPkg name="Demo1" version="1.0">
<implementation>
<codebase href="http://somewhere.com/myweb.cab">
</implementation>
<homepage>myweb://somewhere.com/default.ASPx</homepage>
<Iconurl>myweb://somewhere.coom/icon.gif</Iconurl>
<RemoteIconurl>http://somewhere.com/icon.gif</RemoteIconurl>
<Author>white</Author>
<Source> Beijing 123okey.Inc</Source>
<size>3000</size>
</soFTPkg>
4).略
5).獨立存儲空間
myweb不能訪問本地文件系統,但可以訪問由GNWS提供的獨立存儲空間(IsolatedStorage),
就像訪問本地文件一樣,例:
//讀取數據
String _storeFile="mystore";
ArrayList values=new ArrayList();
IsolatedStorageFileStream stream = null;
try{
stream = new IsolatedStorageFileStream(_storeFile,FileMode.Open);
}catch(Exception e){}
if(null!=stream){
values=(ArrayList)BinarySerializer.DeSerialize(stream);
stream.Close();
}
//保存數據
IsolatedStorageFileStream stream;
stream = new IsolatedStorageFileStream(_stroeFile,FileMode.OpenOrCreate);
ArrayList values = new ArrayList();
values.Add("test1");
......
BinarySerializer.Serializer(values,stream);
stream.Close();
使用上例時注意需要引入名稱空間:
System.IO;
System.IO.IsolatedStorage;
System.Runtime.Serialization.Formatters;
6).離線數據同步
現在這個版本的myweb還不支持自動地實現同步。
可以用myweb.Connected屬性判斷當前是否連在網上。
六、Cache服務
Caching動態產生的內容叫output catching。
Caching專門的對象叫Data Catching。
ASP+中提供了專門的Cache引擎。
1).output caching
設置response的expiration/validation,僅對GET和HEAD有效,支持URL中的參數,完全相同
時使用catching中的內容。內容缺省地將在cache中保存60分鐘。
要讓一個.ASPx文件被caching,僅需要加一行:
<%@ OutputCache Duration="60" %>
上面的60指60秒。
要實現更多的控制,如下:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
或者:
SetExpires(DateTime.Now.AddSeconds(60));
SetCacheability(HttpCacheability.Public);
SetSlidingExpiration(true);
2).Data Caching
Cache引擎可以讓你把對象保存到其中,只有應用重啟後才需要重建Cache。是一個字典接口,如:
Cache["mykey"]=myValue;
myValue = Cache["mykey"];
if(myValue!=null)
......
還可以支持清除,過期等,以及文件和鍵值以來(可以用於統計圖形,記數器等)。
例:
source = (DataVIEw)Cache["MyDataSet"];
if(source == null){
......
source = new DateVIEw(ds.Tables[0]);
Cache["MyDataSet"] = source;
}
文件依賴:
Cache.Insert("MyData",source,new CacheDependency(server.mappath("authors.XML")));
時間過期:
Cache.Insert("MyData",source,null,DateTime.Now.AddHours(1),TimeSpan.Zero);
注意,為了防止資源訪問中的沖突,必須對資源訪問進行同步,如:
PRivate static String CacheSynchronize;
lock(CacheSynchronize)
{......
}
七、配置
ASP+中使用文件做配置。
在其中,也可以配置自己的信息。
1).配置文件格式
文件名為config.web,應用當前應用及其自目錄下的應用。
WinNT\ComPlus\<version>\Config.web是整個系統的缺省配置。config.web不可能被浏覽器
訪問到,即便放在WEB應用的目錄下。
配置文件中分成兩小節,第一節指出誰來處理配置信息,第二小節是具體的配置數據。
標准的ASP+配置處理器有:
<httpmodules> 處理所有的請求
<httphandlers> 將特定的URL映射到特定的處理器,子目錄中應用不繼承該配置。參考前面
的http處理器和工廠。
<sessionstate> session狀態處理器
<globalization>
<compilation> 編譯相關的處理
<trace> ASP+ Trace服務
<security> ASP+安全模塊
<iisprocessmodel> IIS處理模塊
<browsercaps> 處理浏覽器兼容信息的設置
2).獲取配置信息
可以用API直接訪問配置信息,比如Request.Browser對象的屬性直接獲得browsercapabilitIEs
或者調用Context.GetConfig,比如:
CustomConfigSettings Config=(CustomConfigSettings)Context.GetConfig("customconfig");
if(config.Enabled==true)
......
GetConfig可有第二個參數獲得指定的URL的配置。
下面是一個保存應用自己的配置數據的例:
<configuration>
<configsections>
<add name="databases" type="System.Web.Configuration.DictionarySectionHandler" />
</configsections>
<databases>
<add key="pubs" value="server=localhost;uid=sa;pws="/>
<add key="nothwind" value="server=localhost;uid=sa"/>
</databases>
</configuration>
使用:
String dsn = (String)((Hashtable)Context.GetConfig("databases"))["pubs"];