- 背景
今天接到客戶的電話,說部署上去的項目樹型的treeview無法正常顯示,顯示成了好幾個大紅叉。如:

- 排查
於是我通過遠程登錄到服務器,在本地測試了一會發現沒有這個問題存在,無論是通過IP地址、localhost或是127.0.0.1,treeview的圖標都是可以正常訪問的。
后來嘗試了用域名的形式訪問,就發現treeview的圖標無法顯示,而是以無法找到資源的大紅叉代替。
在這里,就出現了這樣的問題:在服務器部署成功,測試沒問題時,通過域名的映射竟然會有所不同?
於是,打開查看源文件,發現treeview的圖標是以
<a href="javascript:__doPostBack('OrgTree','tone0\\101')"><img src="/WebResource.axd?d=lGGrcXYTVjltmmHcco2Supo9tdUu0f434OBzmrYsJsNC93G2SEJwl0IBbEihwwiH91wr0uCxBKlHULSLKzmwe13uuDGp-nUJ0ydYs4WjZR3g92sp0&t=635083448141708196" alt="折疊 表格下載" style="border-width:0;" /></a>
類似以上形式存在的。於是就對比了一下,通過IP地址訪問WebResource.axd請求的資源正常;而通過域名的形式訪問WebResource.axd請求的資源出現錯誤:
“/XXX”應用程序中的服務器錯誤。
遠程服務器返回錯誤: (404) 未找到。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。異常詳細信息: System.Net.WebException: 遠程服務器返回錯誤: (404) 未找到。
源錯誤:
執行當前 Web 請求期間生成了未處理的異常。可以使用下面的異常堆棧跟蹤信息確定有關異常原因和發生位置的信息。 |
堆棧跟蹤:
[WebException: 遠程服務器返回錯誤: (404) 未找到。] System.Net.HttpWebRequest.GetResponse() +5400333 DC.Web.HttpCompress.CompressWebResource.CompressResource(HttpContext context) +402 DC.Web.HttpCompress.HttpModule.context_EndRequest(Object sender, EventArgs e) +153 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 |
版本信息: Microsoft .NET Framework 版本:2.0.50727.3649; ASP.NET 版本:2.0.50727.3657
- 現場狀況
為什么通過域名形式請求WebResource.axd資源會出現異常,從而導致treeview無法正常顯示圖標?
我分析如下:
1、應用系統使用了8080端口
2、客戶的服務器內部網絡,通過地址映射的形式nat到服務器的IP;
3、使用了二級域名對IP進行訪問;
4、在ping域名得到的地址不是服務器實際的IP地址;
- 猜想
有了以上的對現場狀況的分析,我們可以推斷以下結論或猜想:
1、可能網絡應用安全網關的策略出了問題;
2、地址映射規則出了問題,導致通過域名訪問資源時地址依然是沒有映射前的IP;
3、微軟通過WebResource.axd生成嵌入式資源的treeview圖標的請求地址,大像攻擊代碼,被攔截了;
4、微軟.net framework 2.0的bug的問題;
5、在啟動網頁壓縮時出現問題如DC.Web.HttpCompress;
- 解決方案
有了以上的分析結論或猜想,問題就不難解決了。
由於時間關系,也沒有去深入研究,只認為既然WebResource.axd請求的資源有問題,那就不用微軟提供的嵌入式資源吧,用自己的,我的資源我做主嘛;
於是添加了應用網站的主題,加入以下代碼,問題就迎刃而解 :):
代碼如下:
<asp:TreeView runat="server" ShowLines="True" LineImagesFolder="~/Images/Tree/" >
</asp:TreeView>
dashplus.gif、dashminus.gif、i.gif、l.gif、lminus.gif、lplus.gif、t.gif、tminus.gif、tplus.gif
- 結論
1、不要過多的依賴微軟,項目能不用WebResource就不用;
2、微軟通過主題的思想,確實是了不起,避免了要修改N多個文件,只需要添加一個主題,指定默認主題即可;當然如果某一小菜,都在去掉主題並設置了treeview的屬性,那也只能是杯具;
3、最近的苦水……,不說了。。。