我几天来一直在努力解决这个问题。找不到任何好的例子,或者我理解的例子。
背景: 我拥有一个用户博客的小博客平台。 每个用户都有自己的子域名,目前没有可用的站点地图。不好。 我想创建某种动态站点地图,其中所有站点地图节点都从数据库中检索。站点地图将仅用于搜索引擎蜘蛛。 系统:ASP.NET,mySQL。
站点地图是纯XML。所以我需要以某种方式创建一个返回xml-data而不是html的ASPX文件。 我需要以某种方式将web.sitemap重定向到该动态文件。
我从未使用过XML,我也不知道如何创建一个创建XML数据的文件。所以我甚至不知道要搜索什么。 我不希望任何静态站点地图文件存储在服务器上。一切都应该在飞行中创建。
因此。请。如果您可以给我一些关于XML的建议,可以在互联网上找到任何示例,或者只是搜索什么。
我的主要问题:
1。 如何从aspx文件创建XML输出?
2。 如何“通知”系统,搜索引擎抓取工具要抓取的文件是“/sitemap.aspx”
谢谢!
答案 0 :(得分:0)
我查看了MvcSiteMapProvider.MVC5,我无法让它工作。首先,它修改了我的Web.config,使我的css和js文件在运行我的Web应用程序时找不到404。
随着我花时间让MvcSiteMapProvider工作,我本来可以写自己的。
所以...这是我自己的生成站点地图xml的愚蠢版本。 唯一的事情是您必须手动指定路线。我还没有添加反射来通过每个控制器并拉出每个动作。
数据驱动的作品非常好用。
在您的Home控制器中添加操作Sitemap和私有帮助程序方法。 GetRouteUrls是手动添加的控制器/动作路由。 GetDynamicUrls构建数据驱动的Urls。在我的例子中,我有一个LiquidsController和一个Details(字符串id)动作。
public ActionResult Sitemap()
{
var xml = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("urlset",
new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9")
, GetRouteUrls()
, GetDynamicUrls()
)
);
return new XmlActionResult(xml);
}
private List<XElement> GetDynamicUrls()
{
var result = new List<XElement>();
using (var db = new ApplicationDbContext())
{
var liquids = db.Liquids.ToList();
foreach (var liquid in liquids)
{
result.Add(LocUrl("Liquids", "Details", liquid.FriendlyId));
}
}
return result;
}
private List<XElement> GetRouteUrls()
{
var result = new List<XElement>();
result.Add(LocUrl("Account", "Register"));
result.Add(LocUrl("Account", "Login"));
result.Add(LocUrl("Home", "Index"));
result.Add(LocUrl("Home", "About"));
result.Add(LocUrl("Home", "Contact"));
result.Add(LocUrl("Home", "TermsOfService"));
result.Add(LocUrl("Home", "PrivacyStatement"));
result.Add(LocUrl("Liquids", "Index"));
result.Add(LocUrl("Vendors", "Index"));
result.Add(LocUrl("Hardware", "Index"));
return result;
}
private XElement LocUrl(string controller, string action, string id = null)
{
if (!string.IsNullOrEmpty(id))
action = string.Format("{0}/{1}", action, id);
var baseUri = string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
return new XElement("url",
new XElement("loc", string.Format("{0}{1}/{2}", baseUri, controller, action))
);
}
然后我添加了一条路线,以便我可以访问站点地图/ / sitemap
routes.MapRoute(name: "sitemap", url: "sitemap", defaults: new {controller = "Home", action = "Sitemap"});
可以在此处找到XmlActionResult返回类型: Return XML from a controller's action in as an ActionResult?