0

我已经为此苦苦挣扎了几天。找不到任何好的例子,或者我理解的例子。

背景:我有一个小博客平台供用户写博客。每个用户都有自己的子域,目前没有可用的站点地图。不好。我想创建某种动态站点地图,其中所有站点地图节点都从数据库中检索。该站点地图将仅用于搜索引擎蜘蛛。系统:ASP.NET、mySQL。

站点地图是纯 XML。所以我需要以某种方式创建一个返回 xml-data 而不是 html 的 ASPX 文件。我需要以某种方式将 web.sitemap 重定向到该动态文件。

我从未使用过 XML,也不知道如何创建创建 XML 数据的文件。所以我什至不知道要搜索什么。我不希望将任何静态站点地图文件存储在服务器上。一切都应该即时创建。

所以。请。如果你能给我一些关于 XML 的建议,互联网上的任何例子,或者只是搜索什么。

我的主要问题:

1. 如何从 aspx 文件创建 XML 输出?

2. 如何“通知”系统和搜索引擎爬虫要爬取的文件是“/sitemap.aspx”

谢谢!

4

1 回答 1

0

我查看了 MvcSiteMapProvider.MVC5,但我无法让它工作。首先,它修改了我的 Web.config,以至于我的 css 和 js 文件在运行我的 Web 应用程序时出现 404 未找到。

随着我花时间让 MvcSiteMapProvider 工作,我本来可以自己写的。

所以...这是我自己生成站点地图 xml 的简化版本。唯一的事情是您必须手动指定路线。我还没有添加反射来遍历每个控制器并拉出每个动作。

数据驱动的部分工作得很好。

在您的 Home 控制器中添加动作站点地图和私有辅助方法。GetRouteUrls 是手动添加的控制器/动作路由。GetDynamicUrls 构建数据驱动的 Urls。在我的示例中,我有一个 LiquidsController 和一个 Details(string 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?

于 2014-08-17T16:59:39.683 回答