這次的課程首先說明了AJax技術濫用的危害。
AJax是一個很好的技術但是象很多事情一樣,過度使用就會有一定的危害。
- Round-trip增多導致性能降低。Round-trip就是只提交到服務器和服務器回發的次數增多,這樣,增大了服務器的響應次數,導致服務器負擔增大。
- 交互性降低導致用戶體驗變差。主要的問題在於Ajax是無刷新的在處理頁面,有的AJax頁面沒有提供數據正在加載的提示,導致用戶不清楚現在數據是否正在提交或者加載。
- 無端使用Ajax技術容易增加安全隱患。這個大家應該清楚,使用Ajax會通過Ajax訪問WebService,我不知道Ajax是否可以使用Soap Head驗證客戶,並且AJax能否訪問帶有SSL的WebService,我覺得如果能解決這兩個問題,安全方面應該不用太擔心。
- Ajax技術是天生的搜索殺手。使用了AJax的頁面可能會導致搜索引擎的搜索程序不能找到。
為了減輕服務器的負擔,Ajax應用種應該使用預加載,就是說在頁面第一次訪問服務器的時候,就將應該回發的數據傳送到客戶端,用戶操作使用AJax調用的時候不是從服務段取得數據,而是從客戶端。
Profile Service的預加載
通過ProfileService的LoadPropertIEs屬性,進行Profile的預加載。
客戶端調用ProfileSerivce的實質就是ASP.Net AJax調用包裝了Profile的WebService.
那麼我們可以通過兩種手段來擴展Profile。
1、擴展ASP.Net的Profile
自定義一個Profile類CustomProfile,他繼承於System.Web.Profile.ProfileProvider類,CustomProfile類,需要實現以下抽象方法
- Initialize
- ApplicationName
- GetPropertyValues
- SetPropertyValues
- DeleteProfiles
- DeleteInactiveProfiles
- GetAllProfiles
- GetAllInactiveProfiles
- FindProfilesByUserName
- FindInactiveProfileByUserName
- GetNumberOfInactiveProfiles
然後需要在WebConfig文件裡指定ProfileProvider由哪個類來提供。如下例
<profile enabled="true" automaticSaveEnabled="true" defaultProvider="CustomProvider">
<providers>
<clear />
<add name="CustomProvider"
type="CustomProvider"
connectionStringName="ProfileDatabase"
applicationName="ProfileSample"
description="Sample for ASP.Net profile and Profile Service" />
</providers>
<propertIEs>
<add name="Name" type="System.String"/>
<add name="Email" type="System.String" />
<add name="Age" type="System.Int32" />
<group name="Address">
<add name="City" type="System.String" />
<add name="Street" type="System.String" />
<add name="PostalCode" type="System.String" />
</group>
</propertIEs>
</profile>
當然這樣繼承ProfileProvider的方法,十分的繁瑣,我們需要重寫很多的基類。
那麼ASP.Net AJax訪問Profile的時候,外部包裝了一層WebService,我們可以重寫這個類。
2、重寫AJax客戶端訪問Profile的WebService。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class CustomProfileService : System.Web.Services.WebService
...{
[WebMethod]
public IDictionary<string, object> GetAllPropertIEsForCurrentUser()
...{
return null;
}
[WebMethod]
public IDictionary<string, object> GetPropertiesForCurrentUser(string[] propertIEs)
...{
return null;
}
[WebMethod]
public int SetPropertIEsForCurrentUser(IDictionary<string, object> values)
...{
return 0;
}
}
GetAllPropertiesForCurrentUser方法:從當前用戶得到所有的PropertIEs,返回值是一個字典的集合,包含了由客戶端傳來的鍵值對應。
GetPropertiesForCurrentUser:從當前用戶根據指定的Properties集合名字得到這些PropertIEs字典已和。
SetPropertiesForCurrentUser:為當前的用戶設置PropertIEs集合。參數是一個關於這個用戶的字典集合。
那麼在實現這些方法之後,需要在ScriptManager裡指定ProfileService的路徑,告訴客戶端調用這個Profile Web Service
<ASP:ScriptManager ID="ScriptManager1" runat="server">
<ProfileService Path="CustomProfileService.asmx" />
</ASP:ScriptManager>