为我的ASP.NET Http处理程序指定确切路径

为我的ASP.NET Http处理程序指定确切路径,asp.net,web-config,httphandler,Asp.net,Web Config,Httphandler,我使用Http处理程序动态生成XML/Google站点地图,因此不需要手动维护XML文件 我已将我的Http处理程序映射到web.config中的“sitemap.xml”,如下所示: <httpHandlers> <add verb="*" path="sitemap.xml" type="My.Name.Space, MyAssembly" /> </httpHandlers> 它工作得很好。现在,www.mywebsite.com/sitema

我使用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”,但两者都不起作用

我在这里遗漏了什么吗?

2解决方案:

解决方案1: 您可以使用request.Url属性检查请求路径,如果请求来自根路径,则可以生成XML,否则不做任何操作

解决方案2: 在不希望处理sitemap.xml文件请求的每个文件夹中放置一个具有以下设置的web.config文件


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

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


根据建议的解决方案#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文档-

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


我建议您继承HttpApplication,并在那里实现工厂,但这是您的要求。

解决方案1仍然意味着运行处理程序的代码。我不想那样。我只想在请求特定URL(根)时运行它。诚然,这是我的退路。解决方案2实际上不是一个选项:在每个目录中放置一个web.config!如果我有数百个目录呢?这更像是我想要的,但现在它需要一个物理的.ashx文件,而目前我没有这个文件-只有一个实现IHttpHandler的类,在我的web项目中没有物理文件。如果没有更好的建议,我将使用此方法…您可以在web应用程序中创建一个ashx文件,指向另一个程序集中的处理程序,如下所示:这里我指的是另一个程序集中名为“MyHandlers”的处理程序,我尝试了一下,最后自己按照上面的建议发布了404。处理程序的代码仍会运行,但只有在请求不存在的页面时才会运行。