2010-08-02 67 views
11

我一直有一些生產運行時錯誤,我不完全理解。這發生在我們兩個不同的ASP.NET 4.0網站上(不寒而慄 - 是的,我知道 - 我們將它移植到MVC,但這需要一些時間)。Sitemap隨着時間的推移而隨機分佈

首先,我們從來沒有能夠在開發/質量保證環境中重現此問題。其次,部署後,這個問題似乎是不存在的。有時候這個問題會在部署的一兩天內展現出來,而其他時間部署將會持續一個月而不會顯示出來。但是,一旦它出現,那麼在網站下查看的任何頁面都會導致錯誤。最後,這個問題似乎只有在我們遷移到.NET 4.0後纔會出現。我們從2.0開始,一年前升至3.5,最近通過此解決方案和大多數兒童項目升級到4.0。

錯誤: Could not find the sitemap node with URL '~/Default.aspx'.

我們的網站地圖的簡化版本(有一些名字改變和無趣節點刪除)如下:

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> 
    <siteMapNode roles="*" title="EG"> 
     <siteMapNode url="~/../SM/Default.aspx" title="Welcome" description="" roles="*" /> 
     <siteMapNode url="~/../SD/Default.aspx" title="SD" description="" roles="*" /> 
     <siteMapNode url="~/../SMD/Default.aspx" title="SMD" description="" roles="*" /> 
     <siteMapNode url="~/Default.aspx" title="Ops" description="" roles="*" > 
     <siteMapNode url="~/Error.aspx" title="Error" hide="true" roles="*" /> 
     <siteMapNode url="~/Public/Login.aspx" hide="true" roles="*" /> 
     <siteMapNode url="~/Manager/LPCE.aspx" title="LPCE" description="" roles="Administrator, Manager, System, Marketer" imageUrl="~/../SM/images/icons/LF.jpg" /> 
     </siteMapNode> 
     <siteMapNode url="~/../SDD/Default.aspx" title="SDD" description="" roles="*" /> 
     <siteMapNode url="~/../CCD/Default.aspx" title="CCD" description="" roles="*" /> 
     <siteMapNode url="~/../RD/Default.aspx" title="RD" description="" roles="*"/> 
     <siteMapNode url="~/../SBD/Default.aspx" title="SBD" description="" roles="*" /> 
    </siteMapNode> 
</siteMap> 

它在我們的web.config中註冊:

<siteMap defaultProvider="SDXmlSiteMapProvider" enabled="true"> 
    <providers> 
    <add name="SDXmlSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="true" /> 
    <add name="SecurityDisabledSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="false" /> 
    </providers> 
</siteMap> 

而從日誌我已經縮小了是什麼原因導致錯誤是在一個基類幾乎所有我們的p年齡從派生:

private void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     SiteMapDataSource.StartingNodeUrl = "~/Default.aspx"; 
    } 
} 

我已確認在所有的Sitemaps存在與URL =「〜/ Default.aspx的」與角色的節點=「*」(包括公共/匿名訪問),所以我很困惑,爲什麼會出現這個問題。

的問題我也考慮過:

  1. 地圖不具備Default.aspx的一個節點。 所有這些都是。
  2. 由於安全原因,SiteMap的Default.aspx節點無法訪問當前用戶/角色。 它們都可以被匿名用戶訪問,甚至超級管理員用戶也會遇到這個問題。
  3. 傳入的URL包含查詢字符串(Default.aspx?abcd)。 我不知道這是否是一個問題(我當然希望不會),但是一旦問題出現,我就可以手寫URL而沒有querystrings,問題依然存在。
  4. SiteMap變化。 它不是
  5. 服務對站點地圖文件的權限。 站點地圖在部署後工作得很好,因此除非以IISRESET修復方式更改權限,否則這不是問題。
  6. 工作進程變得全局損壞。 我不這麼認爲。我們有大約12個網站都在同一個應用程序池中,問題始終侷限在單個網站中。此外,我們還沒有發生過這種情況,但它一次只能在一個網站上發佈,儘管迄今爲止它已經在4個不同的網站中出現。

任何人都可以對此有所瞭解嗎?它幾乎看起來好像動態編譯的SiteMap被損壞或什麼的。我發現的唯一解決方案是IISRESET或同等產品。即使如此,也不知道問題能夠解決多久。這非常令人沮喪!

+0

託管在哪個服務器上? – 2010-08-02 17:45:44

+0

贏2003 R2標準 – Jaxidian 2010-08-02 18:57:33

+0

我們仍然有這個問題,並仍然想有這個答案... – Jaxidian 2010-11-22 13:06:28

回答

0

嗯。它是一個幾年以來我與ASP.net的工作,但如果我還記得,我有我與

Page.ResolveURL("~SomePage.aspx"); 

在運行時的Sitemap網址解析爲實際的URL解決了類似的問題,所以波浪被刪除並替換爲實際的URL(我認爲:))。

+0

我必須給出這個鏡頭 - 謝謝! – Jaxidian 2010-11-29 14:26:50

+0

順便說一句,這從來沒有幫助過我。 – Jaxidian 2011-03-18 22:33:23

+0

那麼你自己解決了嗎?如果是這樣,其他人可能對知道如何感興趣。就像我說的,它已經有一段時間了。 – Kell 2011-03-24 10:03:30

0

我對這個問題有兩個可能的想法。兩者都不能保證工作。 ;-)

  1. 難道你還使用URL授權在同一時間 在一些你的web.config文件位於不同的文件夾 整個Web應用程序?

    例URL授權設置,可以在一個 web.config文件中找到:

    <location path="bobsSecret.aspx"> 
        <system.webServer> 
         <security> 
          <authorization> 
           <remove users="" roles="BobAndFriends" verbs="" /> 
           <add accessType="Allow" users="Bob" />   
    
          </authorization> 
         </security> 
        </system.webServer> 
    </location> 
    

    我之所以提到這一點是我在過去一些麻煩試圖 得到角色屬性在我網站地圖XML文件正常工作 與我已應用於我的URL授權中的設置在web.config中。

    我能想象到的唯一的事情將是某種形式的競爭條件 其中負責執行這些政策的過程 讀一個安全設置在一個地方(的web.config) 之前在另一個地方(網絡閱讀它。網站地圖)。

    只是在黑暗中刺傷,根據過去的一些問題,我有 經驗!

  2. 作爲第二選擇,你可以考慮把這個配置放置在 你的aspx頁面,而不是在Page_Load事件的代碼後面。 你可以試試這個:

    <asp:SiteMapDataSource 
        id="SiteMapDataSource1" 
        runat="server" 
        StartingNodeUrl="~/Default.aspx"> 
    </asp:SiteMapDataSource> 
    

    你StartingNodeUrl在ASPX頁面本身指定這樣一來,如果這是真正的框架代碼間歇性的錯誤,也許這細微的變化可能會解決問題。

2

我把以前的帖子在此線程,進行了刪除:(反正我「有」同樣的問題。

我發現,不管我做了「無法找到該站點地圖結點URL'〜/ rootnode「發生了,當我決定刪除文件系統依賴關係,並從惡意代碼切換到SqlSiteMapProvider時,我發現這個問題被更可靠地重新創建。

總之你得到這個消息是因爲沒有網站地圖!我發現在站點地圖數據源上使用StartingNodeUrl="~/root.htm"時,如果沒有構建站點地圖,則會顯示錯誤消息。但是,如果您使用StartingNodeOffset="0",則不會顯示錯誤消息,並且在未構建站點地圖時根本沒有呈現菜單。

對我來說看起來很陌生,但我將它追溯到XmlSiteMapProvider。有時候它有時並不構建。無法讓我的頭完全置於發動機罩下,但它看起來像是異步發生的事情。無論如何,我已經從wickedcode切換到SqlSiteMapProvider。

一個變化我做了,除了轉換爲VB是把一個遞歸調用上覆蓋BuildSiteMap方法的返回:

' Return the root SiteMapNode 
If _Root Is Nothing Then 
    Return Me.BuildSiteMap 
Else 
    Return _Root 
End If 

這將確保網站地圖版本。我想過把一個無限的遞歸守衛放進去,但似乎並不需要。

我仍然認爲可能是網絡延遲或一些身份驗證(在我們的地方是通過AD控制器,並在第一天早上落後!!)是什麼使XmlSiteMapProvider錯過它的異步生成窗口?

真希望這會有所幫助。

相關問題