在 ASP.NET MVC 中创建 SiteMap
Create SiteMap in ASP.NET MVC
我想为 ASP.NET MVC 站点创建 SiteMap。我写这段代码
[XmlRoot("urlset", Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")]
public class Sitemap
{
private ArrayList _map;
public Sitemap()
{
_map = new ArrayList();
}
[XmlElement("url")]
public Location[] Locations
{
get
{
Location[] items = new Location[_map.Count];
_map.CopyTo(items);
return items;
}
set
{
if (value == null)
return;
var items = (Location[])value;
_map.Clear();
foreach (Location item in items)
_map.Add(item);
}
}
public int Add(Location item)
{
return _map.Add(item);
}
}
public class Location
{
public enum EChangeFrequency
{
Always,
Hourly,
Daily,
Weekly,
Monthly,
Yearly,
Never
}
[XmlElement("loc")]
public string Url { get; set; }
[XmlElement("changefreq")]
public EChangeFrequency? ChangeFrequency { get; set; }
public bool ShouldSerializeChangeFrequency() { return ChangeFrequency.HasValue; }
[XmlElement("lastmod")]
public DateTime? LastModified { get; set; }
public bool ShouldSerializeLastModified() { return LastModified.HasValue; }
[XmlElement("priority")]
public double? Priority { get; set; }
public bool ShouldSerializePriority() { return Priority.HasValue; }
}
public class XmlResult : ActionResult
{
private readonly object _objectToSerialize;
public XmlResult(object objectToSerialize)
{
_objectToSerialize = objectToSerialize;
}
public object ObjectToSerialize
{
get { return _objectToSerialize; }
}
public override void ExecuteResult(ControllerContext context)
{
if (_objectToSerialize != null)
{
context.HttpContext.Response.Clear();
var xs = new XmlSerializer(_objectToSerialize.GetType());
context.HttpContext.Response.ContentType = "text/xml";
xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
}
}
}
并在 NewsFeedController
中创建 Sitemap
操作,就像这样
public ActionResult Sitemap()
{
var sm = new Sitemap();
sm.Add(new Location()
{
Url = string.Format("http://www.TechnoDesign.ir/Articles/{0}/{1}", 1, "SEO-in-ASP.NET-MVC"),
LastModified = DateTime.UtcNow,
Priority = 0.5D
});
return new XmlResult(sm);
}
并在 RouteConfig
中像这样为 SiteMap 定义新路由
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"SiteMap_route", // Route name
"sitemap.xml", // URL with parameters
new { controller = "NewsFeed", action = "Sitemap", name = UrlParameter.Optional, area = "" }, // Parameter defaults
namespaces: new[] { "Web.Controllers" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "Web.Controllers" }
);
}
但是当输入/sitemap.xml
得到error 404
对于 MVC 4 及更高版本的 MvcSiteMapProvider,我们遇到了同样的问题。我们通过删除然后替换 web.config 文件中的 UrlRoutingModule
来解决它。
<configuration>
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>
</configuration>
在 MVC 5 及以下版本(MVC 6 可以)中不允许创建末尾带有文件扩展名 (.xml) 的路由,因此您需要在 Web.config 文件.
<configuration>
<system.webServer>
<handlers>
<add name="SitemapXml" path="sitemap.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>
我想为 ASP.NET MVC 站点创建 SiteMap。我写这段代码
[XmlRoot("urlset", Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")]
public class Sitemap
{
private ArrayList _map;
public Sitemap()
{
_map = new ArrayList();
}
[XmlElement("url")]
public Location[] Locations
{
get
{
Location[] items = new Location[_map.Count];
_map.CopyTo(items);
return items;
}
set
{
if (value == null)
return;
var items = (Location[])value;
_map.Clear();
foreach (Location item in items)
_map.Add(item);
}
}
public int Add(Location item)
{
return _map.Add(item);
}
}
public class Location
{
public enum EChangeFrequency
{
Always,
Hourly,
Daily,
Weekly,
Monthly,
Yearly,
Never
}
[XmlElement("loc")]
public string Url { get; set; }
[XmlElement("changefreq")]
public EChangeFrequency? ChangeFrequency { get; set; }
public bool ShouldSerializeChangeFrequency() { return ChangeFrequency.HasValue; }
[XmlElement("lastmod")]
public DateTime? LastModified { get; set; }
public bool ShouldSerializeLastModified() { return LastModified.HasValue; }
[XmlElement("priority")]
public double? Priority { get; set; }
public bool ShouldSerializePriority() { return Priority.HasValue; }
}
public class XmlResult : ActionResult
{
private readonly object _objectToSerialize;
public XmlResult(object objectToSerialize)
{
_objectToSerialize = objectToSerialize;
}
public object ObjectToSerialize
{
get { return _objectToSerialize; }
}
public override void ExecuteResult(ControllerContext context)
{
if (_objectToSerialize != null)
{
context.HttpContext.Response.Clear();
var xs = new XmlSerializer(_objectToSerialize.GetType());
context.HttpContext.Response.ContentType = "text/xml";
xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
}
}
}
并在 NewsFeedController
中创建 Sitemap
操作,就像这样
public ActionResult Sitemap()
{
var sm = new Sitemap();
sm.Add(new Location()
{
Url = string.Format("http://www.TechnoDesign.ir/Articles/{0}/{1}", 1, "SEO-in-ASP.NET-MVC"),
LastModified = DateTime.UtcNow,
Priority = 0.5D
});
return new XmlResult(sm);
}
并在 RouteConfig
中像这样为 SiteMap 定义新路由
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"SiteMap_route", // Route name
"sitemap.xml", // URL with parameters
new { controller = "NewsFeed", action = "Sitemap", name = UrlParameter.Optional, area = "" }, // Parameter defaults
namespaces: new[] { "Web.Controllers" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "Web.Controllers" }
);
}
但是当输入/sitemap.xml
得到error 404
对于 MVC 4 及更高版本的 MvcSiteMapProvider,我们遇到了同样的问题。我们通过删除然后替换 web.config 文件中的 UrlRoutingModule
来解决它。
<configuration>
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
</modules>
</system.webServer>
</configuration>
在 MVC 5 及以下版本(MVC 6 可以)中不允许创建末尾带有文件扩展名 (.xml) 的路由,因此您需要在 Web.config 文件.
<configuration>
<system.webServer>
<handlers>
<add name="SitemapXml" path="sitemap.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>