指定ASP.NET Http Handler的确切路径

时间:2009-03-31 07:44:12

标签: asp.net web-config httphandler

我使用Http Handler动态生成XML / Google站点地图,因此我无需手动维护XML文件。

我已将我的Http Handler映射到我的web.config中的“sitemap.xml”,如下所示:

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

很好用。现在,www.mywebsite.com / sitemap.xml将我的Http Handler设置为动作并完全按照我的意愿行事。但是,这个网址也是这样的:www.mywebsite.com/some/folder/sitemap.xml我真的不想要那个,即我只是想将我的处理程序映射到我的应用程序的根目录。

我尝试将web.config中处理程序的“路径”更改为“/sitemap.xml”和“〜/ sitemap.xml”,但都不起作用。

我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:5)

尝试将以下内容添加到您的web.config

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

这使用了一个名为'Url Mapping'

的ASP.NET 2.0的一个鲜为人知的功能

答案 1 :(得分: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再次重新调用您的Handler。可能值得在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

答案 2 :(得分:0)

2解决方案:

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

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

  

答案 3 :(得分:0)

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

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