Kentico:以编程方式检索页面的呈现内容

Kentico: Retrieving the rendered content of a page programmatically

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

我想做的是,我想开发一个小部件来检索其中一个页面的内容,然后 processes/encapsulates 它。或者用更专业的话来说,我想在我的小部件 class.

中将页面内容作为 HTML 字符串

不幸的是,Kentico API 没有提供检索页面内容的方法,或者至少,我不知道如何检索。有一个 Kentico Web 部件 "page placeholder",它完全可以满足我的需要,但是,我找不到在小部件中使用其功能的方法。我假设我可以在我的 widget.ascx 中使用 cms:CMSPagePlaceholder 标签,但由于某种原因它在那里是不可见的(不过我可以 select 来自 Kentico CMS 命名空间的许多不同的其他控件)。

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

(401) Unauthorized

不过,我可以在浏览器中打开给定的 URL。 (如果你能告诉我为什么会这样,你会得到加分。我在不同的上下文(访问登台网络服务)中偶然发现了这个 401 错误,但不太明白为什么。与登台一样:我可以访问在浏览器中暂存 Web 服务的 URL 但不是在 Kentico 中...很奇怪)

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

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

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

这是根据 ASP.NET 表单身份验证对 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");
    }
}

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

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

private HtmlDocument GetDocument(string url)
{
    HtmlWeb page = new HtmlWeb();

    return page.Load(url);
}

这将 return 一个 object 代表 html 的不同部分。 例如,如果你想获得页面的header,那么你可以这样做:

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

希望对您有所帮助!