4

XML ファイルを手動で維持する必要がないように、HTTP ハンドラーを使用してオンザフライで XML/Google サイトマップを生成します。

次のように、web.configでHttpハンドラーを「sitemap.xml」にマップしました。

<httpHandlers>
  <add verb="*" path="sitemap.xml" type="My.Name.Space, MyAssembly" />
</httpHandlers>

それはうまく機能します。これで、www.mywebsite.com/sitemap.xml が私の Http ハンドラーを動作させ、私が望んでいることを正確に実行します。ただし、この URL は同じことを行います: www.mywebsite.com/some/folder/sitemap.xml と私は本当に望んでいません。つまり、ハンドラーをアプリケーションのルートにマップしたいだけです。

web.config のハンドラーの「パス」を「/sitemap.xml」と「~/sitemap.xml」に変更しようとしましたが、どちらも機能しません。

ここで何か不足していますか?

4

4 に答える 4

5

以下を web.config に追加してみてください

<urlMappings enabled="true">
    <add url="~/SiteMap.xml" mappedUrl="~/MyHandler.ashx"/>
</urlMappings>

これは、 「Url マッピング」と呼ばれる ASP.NET 2.0 のあまり知られていない機能を使用します。

于 2009-03-31T12:56:26.463 に答える
1

Kirtan が推奨するソリューション #1 に続いて、次のような回避策を実行できます。

public void ProcessRequest(HttpContext context) {
  //Ensure that the sitemap.xml request is to the root of the application
  if (!context.Request.PhysicalPath.Equals(Server.MapPath("~/sitemap.xml"))) {
     //Invoke the Default Handler for this Request
     context.RemapHandler(null);
  }

  //Generate the Sitemap
}

デフォルトのハンドラーを呼び出すと、IIS がハンドラーを再度呼び出すだけになるかどうかはわかりません。おそらく、VS からデバッグ モードでテストする価値があります。再起動するだけの場合は、代わりに静的ファイル Handler を起動してみる必要があります。または、HTTP 404 を自分で発行することもできます。

//Issue a HTTP 404
context.Response.Clear();
context.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
return;

詳細については、HttpContext.RemapHandler に関する MSDN ドキュメントを参照してください - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx

于 2009-09-01T08:49:23.093 に答える
0

または、global.asax でチェックを実行し、要求を検証して、最後に context.RemapHandler メソッド全体で新しいハンドラーを再割り当てすることもできます。
唯一のことは、そのためにファクトリを実装する必要があるということです。

HttpApplication を継承し、そこにファクトリを実装することをお勧めしますが、それはあなた次第です。

于 2011-01-04T13:36:29.477 に答える
0

これに対する2つの解決策:

解決策 #1: Request.Url プロパティを使用して要求パスを確認できます。要求がルート パスからのものである場合は、XML を生成できます。それ以外の場合は何もしません。

解決策 #2: sitemap.xml ファイルの要求を処理したくないすべてのフォルダーに、次の設定で web.config ファイルを配置します。

于 2009-03-31T07:58:15.900 に答える