4

我使用 Http 处理程序即时生成 XML/Google 站点地图,因此我不需要手动维护 XML 文件。

我已将我的 Http 处理程序映射到我的 web.config 中的“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>

这使用了 ASP.NET 2.0 的一个鲜为人知的功能,称为“Url Mapping”

于 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 的调试模式下进行测试。如果它只是重​​新调用,那么您需要尝试调用一些静态文件处理程序,或者您可以自己发出 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

2个解决方案:

Soln #1:您可以使用 Request.Url 属性检查请求路径,如果请求来自根路径,则可以生成 XML,否则不执行任何操作。

Soln #2:将具有以下设置的 web.config 文件放在您不想处理 sitemap.xml 文件请求的每个文件夹中。

于 2009-03-31T07:58:15.900 回答
0

或者,您可以在 global.asax 中运行检查,验证请求,最后通过 toout context.RemapHandler 方法重新分配新的处理程序。
唯一的问题是你必须为此建立一个工厂。

我建议你继承 HttpApplication,并在那里实现工厂,但那是你的电话。

于 2011-01-04T13:36:29.477 回答