11

私は、完全には理解できない実稼働のランタイム エラーをいくつか抱えています。これは、いくつかの異なる ASP.NET 4.0 Web サイトで発生しました (震え- はい、知っています - MVC に移植していますが、それには時間がかかります)。

まず第一に、開発/QA 環境でこの問題を再現できたことは一度もありません。第二に、展開時に、問題は存在しないようです。デプロイから 1 日か 2 日以内に問題が発生する場合もあれば、デプロイが 1 か月間有効であり、まったく発生しない場合もあります。ただし、いったんマニフェストが発生すると、Web サイトで表示されるすべてのページでエラーが発生します。最後に、この問題は、.NET 4.0 に移行して初めて発生したようです。2.0 から開始し、1 年前に 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>

そして、ログから、エラーの原因を絞り込みました。これは、ほとんどすべてのページの派生元である基本クラスにあります。

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

すべてのサイトマップで、url="~/Default.aspx" と roles="*" (パブリック/匿名アクセスを含む) を持つノードがあることを確認したため、この問題が発生する理由について非常に混乱しています。

私が考えた問題:

  1. SiteMap には Default.aspx のノードがありません。それらのすべてがそうです。
  2. セキュリティ上の理由から、現在のユーザー/ロールは SiteMap の Default.aspx ノードにアクセスできません。それらはすべて匿名ユーザーがアクセスでき、この問題はスーパー管理者ユーザーにも存在します.
  3. 渡された URL にはクエリ文字列が含まれています (Default.aspx?abcd)。これが問題かどうかはわかりませんが (問題が発生しないことを願っています)、問題が明らかになったら、クエリ文字列を使用せずに URL を手書きできますが、問題はまだ存在します。
  4. サイトマップの変更。それはしません
  5. サイトマップ ファイルに対するサービスのアクセス許可。サイトマップは展開後に完全に機能するため、IISRESET が修正する方法でアクセス許可が変更されない限り、これは問題になりません。
  6. ワーカー プロセスがグローバルに破損します。私はそうは思わない。12 個までの Web サイトがすべて同じアプリ プールにあり、問題は常に 1 つの Web サイト内に限定されています。また、これまでに 4 つの異なる Web サイトで発生しましたが、一度に複数の Web サイトでこれが発生したことはまだありません。

誰でもこれに光を当てることができますか?動的にコンパイルされた SiteMap が破損したかのように見えます。私が見つけた唯一の解決策は、IISRESETまたは同等のものです。それでも、問題が解決されるまでの期間はわかりません。これは非常にイライラします!

4

3 に答える 3

2

私は削除されたこのスレッドに以前の投稿を置きました:( とにかく私は同じ問題を「抱えていました」。

何をしても「URL '~/rootnode のサイトマップ ノードが見つかりませんでした」が発生することがわかりました。SqlSiteMapProviderファイルシステムの依存関係を取り除き、邪悪なコードから切り替えることにしたとき、私の休憩が訪れました。この問題はより確実に再現されることがわかりました。

つまり、サイト マップがないため、そのメッセージが表示されます。サイト マップ データ ソースで を使用すると、サイトマップが作成されていStartingNodeUrl="~/root.htm"ない場合にエラー メッセージが表示されることがわかりました。ただし、使用するStartingNodeOffset="0"と、エラーメッセージは表示されず、サイトマップが構築されていないときにレンダリングされるメニューはありません.

私には奇妙に思えましたが、XmlSiteMapProvider までさかのぼって調べました。時々それは構築され、時には構築されませんでした。頭をボンネットの下に完全に入れることはできませんでしたが、非同期的に何かが起こっているように見えました. とにかく、wickedcode から SqlSiteMapProvider に切り替えました。

BuildSiteMapvb への変換以外に行った変更の 1 つは、オーバーライドされたメソッドの戻り時に再帰呼び出しを行うことでした。

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

これにより、サイトマップが確実に作成されます。無限再帰ガードを入れようかと思ったのですが、必須ではないようです。

XmlSiteMapProvider が Async ビルド ウィンドウを見逃しているのは、おそらくネットワーク ラグまたは何らかの認証 (私たちの場所では AD コントローラーを介しており、朝一番にラグが発生します!!) であるとまだ考えています。

これが役立つことを本当に願っています。

于 2012-09-27T09:08:57.400 に答える
0

うーん。ASP.net を使用してから数年が経ちましたが、思い出すと、同様の問題があり、それを解決しました

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

実行時にサイトマップの URL は実際の URL に解決されるため、チルダは削除され、実際の URL に置き換えられます (私は :) と思います)。

于 2010-11-29T10:06:56.523 に答える
0

この問題には 2 つの考えがあります。どちらも動作を保証するものではありません。;-)

  1. Web アプリケーション全体のさまざまなフォルダーにある web.config ファイルの一部で同時に URL 承認を使用している可能性はありますか?

    1 つの web.config ファイルに含まれる URL 認証設定の例:

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

    これについて言及する理由は、過去にサイトマップ XML ファイルの roles プロパティを、 web.config の URL Authorization に適用した設定で正しく機能させようとして、問題が発生したためです。

    私が想像できる唯一のことは、これらのポリシーの適用を担当するプロセスが、別の場所 (web.sitemap) で読み取る前に、ある場所 (web.config) で 1 つのセキュリティ設定を読み取っている、ある種の競合状態です。

    私が経験したいくつかの過去の問題に基づいて、暗闇の中で突き刺すだけです!

  2. 2 番目のオプションとして、コード ビハインドの Page_Load イベントではなく、aspx ページにこの構成を配置することを検討できます。これを試すことができます:

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

    このようにして、StartingNodeUrl が ASPX ページ自体で指定されます。これが本当にフレームワーク コードの断続的なバグである場合は、このわずかな変更で問題が解決する可能性があります。

于 2011-09-15T16:37:08.380 に答える