【问题标题】:Kentico: Retrieving the rendered content of a page programmaticallyKentico:以编程方式检索页面的呈现内容
【发布时间】:2016-01-21 21:40:10
【问题描述】:

我希望我的客户能够在 Kentico 中设计自己的页面,并选择给定的小部件。所以他们创建一个页面,选择一个带有小部件区域的模板,然后放置他们想要的任何小部件。

我想做的是,我想开发一个小部件来检索其中一个页面的内容,然后处理/封装它。或者用更专业的术语来说,我希望在我的小部件类中将页面内容作为 HTML 字符串。

不幸的是,Kentico API 没有提供检索页面内容的方法,或者至少,我不知道该怎么做。有一个 Kentico Web 部件“页面占位符”,它完全符合我的需要,但是,我找不到在小部件中使用其功能的方法。我假设我可以在我的 widget.ascx 中使用 cms:CMSPagePlaceholder 标签,但由于某种原因它在那里不可见(不过,我可以从 Kentico CMS 命名空间中选择许多不同的其他控件)。

我还尝试通过 System.Net.WebClient 类接收内容 - 没有成功。我得到的只是

(401) 未经授权

不过,我可以在浏览器中打开给定的 URL。 (如果你能告诉我为什么会这样,给你加分。我在不同的上下文中偶然发现了这个 401 错误(访问 staging web 服务)并且不能完全弄清楚为什么。staging 同样的事情:我可以访问在浏览器中暂存 Web 服务的 URL,但不是从 Kentico 内部...非常奇怪)

一些背景信息:我正在从存储我的物理文件的客户端进行开发,并且我正在访问服务器上的共享数据库。物理文件在我的客户端和服务器上基本上是重复的。我只是推送我更改的 Web 部件文件。服务器 Kentico 实例的 URL 与我客户的 Kentico 实例的 URL 不同,我将我的客户的 URL 重定向到服务器(通过“站点”设置)。

长话短说,我如何为我的小部件获取文档呈现的 HTML?如果可以的话,我的生活会轻松很多。

【问题讨论】:

    标签: c# asp.net widget kentico


    【解决方案1】:

    尝试以编程方式呈现页面内容可能非常麻烦。我想说WebClient 的方法是唯一明智的方法。根据您的 Kentico 实例的身份验证方法,您必须提供正确的凭据集,以免出现 401 错误。如果您使用 Windows 身份验证,则需要为 Web 请求提供 NetworkCredential 对象。如果您使用表单身份验证,您可以复制 cookie,以便请求“模拟”当前登录的用户。

    这是针对 ASP.NET Forms 身份验证对 System.Net.WebClient 进行身份验证的示例:

    public class CookieReplicatingWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = (HttpWebRequest)base.GetWebRequest(address);
            if (request != null)
            {
                HttpCookieCollection cookies = HttpContext.Current.Request.Cookies;
    
                CookieContainer cookieContainer = new CookieContainer();
    
                for (int i = 0; i < cookies.Count; i++)
                {
                    // Clone cookies
                    HttpCookie httpCookie = cookies[i];
                    if (httpCookie != null)
                    {
                        cookieContainer.Add(new Cookie { Domain = request.RequestUri.Host, Name = httpCookie.Name, Path = httpCookie.Path, Secure = httpCookie.Secure, Value = httpCookie.Value });
                    }
                }
    
                request.CookieContainer = cookieContainer;
            }
            return request;
        }
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        using (WebClient client = new CookieReplicatingWebClient())
        {
            // Request secured area (of Kentico's Corporate sample site)
            string htmlCode = client.DownloadString("http://localhost/Kentico82/Partners/Gold-partners.aspx");
        }
    }
    

    【讨论】:

    • 感谢您的回答!你的代码很有帮助。
    【解决方案2】:

    我认为最好的方法是使用HtmlAgilityPack

    通过使用此工具,您可以非常轻松地加载和管理整个呈现的页面。

    private HtmlDocument GetDocument(string url)
    {
        HtmlWeb page = new HtmlWeb();
    
        return page.Load(url);
    }
    

    这将返回一个代表 html 不同部分的对象。 例如,如果您想获取页面的标题,那么您可以:

    string header = document.DocumentNode.SelectSingleNode("//header").OuterHtml;
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2012-06-09
      相关资源
      最近更新 更多