我使用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”,但都不起作用。
我在这里错过了什么吗?
答案 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,并在那里实施工厂,但那是你的电话。