【问题标题】:Specifying exact path for my ASP.NET Http Handler为我的 ASP.NET Http 处理程序指定确切路径
【发布时间】:2010-10-16 13:44:27
【问题描述】:

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

我错过了什么吗?

【问题讨论】:

    标签: asp.net web-config httphandler


    【解决方案1】:

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

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

    这使用了一个鲜为人知的 ASP.NET 2.0 特性,称为 'Url Mapping'

    【讨论】:

    • 这更像是我所追求的,但现在它需要一个物理 .ashx 文件,而目前我没有那个 - 只是一个实现 IHttpHandler 的类,我的 web 项目中没有物理文件.如果没有更好的建议,我将使用此方法...
    • 您可以在 Web 应用程序中创建一个 ashx 文件,指向另一个程序集中的处理程序,如下所示: 这里我指的是另一个名为“MyHandlers”的程序集中的处理程序
    【解决方案2】:

    按照 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

    【讨论】:

    • 试了试,最后按照上面的建议自己发出了 404。处理程序的代码仍然会运行,但前提是请求一个不存在的页面。
    【解决方案3】:

    2 解决方案:

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

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

    【讨论】:

    • 解决方案 1 仍然意味着通过处理程序的代码运行。我不想那样。我只想在请求特定 URL(根)时运行它。诚然,这是我的后备。解决方案 2 并不是一个真正的选择:将 web.config 放在每个目录中!如果我有数百个目录怎么办?
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-30
      • 2011-11-27
      • 2015-12-26
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多