我有一个大型的附属营销网站,拥有数百万的产品托管在Windows上。对于SEO,我必须提供一个动态创建的sitemap.xml。
public ActionResult SiteMap()
{
string sitemapUrl = "https://trendley.blob.core.windows.net/sitemap/sitemap.xml";
byte[] bImage = null;
using (WebClient wc = new WebClient())
{
bImage = wc.DownloadData(sitemapUrl);
}
return File(bImage, "application/octet-stream");
}我在我的RouteConfig中添加了折叠路径:
routes.MapRoute("Sitemap",
"sitemap.xml",
new { controller = "Home", action = "Sitemap" });不幸的是,这是行不通的。我得到了-> HTTP错误404.0 -未找到
当我将"sitemap.xml“更改为sitemapxml (删除扩展)时,将调用我的控制器方法。已经做了一些研究,并与我的web.config玩,但似乎没有任何工作。
我试过的第一件事是添加:
<modules runAllManagedModulesForAllRequests="true" />第二件事
<add
name="AdfsMetadata"
path="sitemap.xml"
verb="GET"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />谁能告诉我怎么处理这个。我必须为这个写我自己的Handler吗?
干杯,斯特凡
发布于 2013-12-11 22:14:47
该路由不能工作的原因是,在默认情况下,.xml由IIS中的"StaticFileHandler“处理,因此当请求出现时,不会调用ASP.net。
选项1:启用runAllManagedModulesForAllRequests -在web .config中添加以下内容
<modules runAllManagedModulesForAllRequests="true" />它位于system.webserver节点的内部。
选项2:添加.xml到IIS的映射,并将该文件扩展名强制到ASP.net管道中。请参阅这里
发布于 2015-12-19 20:27:45
请遵循以下步骤:
1-删除网站目录根目录中的sitemap.xml (如果存在)
2-将MapRoute for sitemap.xml放在下面的其他MapRoutes之上:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Sitemap",
"sitemap.xml",
new { controller = "Home", action = "Sitemap" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}产生错误的原因是当sitemap RouteMap在其他规则下时,MVC使用上面的RouteMap检查/sitemap.xml,然后抛出错误404以避免匹配控制器/操作。
发布于 2017-02-06 18:13:11
我知道这是一个老话题,但我有一个比"runAllManagedModulesForAllRequests“更好的解决方案。
模块先决条件:
IIS核心引擎使用先决条件来确定何时启用特定模块。例如,性能原因可能会确定您只想对也到托管处理程序的请求执行托管模块。以下示例(
precondition="managedHandler")中的前提条件仅允许对也由托管处理程序处理的请求(如对.aspx或.asmx文件的请求)启用表单身份验证模块: 如果删除属性precondition="managedHandler",窗体身份验证也适用于托管处理程序(如.html、.jpg、.doc )所不提供的内容,但也适用于传统的ASP (.asp)或PHP (.php)扩展。有关为所有内容启用ASP.NET模块的示例,请参见“ASP.NET”。 您还可以使用快捷方式使所有托管(ASP.NET)模块能够为应用程序中的所有请求运行,而不考虑"managedHandler“前提条件。 要使所有托管模块能够运行所有请求,而无需配置每个模块条目以删除"**managedHandler**“先决条件,请使用<modules>部分中的runAllManagedModulesForAllRequests属性: 当您使用此属性时,"managedHandler“前提条件没有任何效果,所有托管模块都为所有请求运行。
您可以从它的原始主题中学到更多:RunAllManagedModulesForAllRequests=“真”意
因此,在MVC上为.XML url设置HTTP处理程序的更好方法是:
<system.webServer>
<handlers>
<add name="Sitemap" path="sitemap.xml" type="System.Web.UI.PageHandlerFactory" verb="*" />
</handlers>
</system.webServer>https://stackoverflow.com/questions/20530889
复制相似问题