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

时间:2015-10-22 14:48:02

标签: c# asp.net widget kentico

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

我想要做的是,我想开发一个小部件来检索其中一个页面的内容,然后处理/封装它。或者用更多的技术词汇,我想在我的widget类中将页面内容作为HTML字符串。

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

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

  

(401)未经授权

但是,我可以在浏览器中打开给定的URL。 (如果你可以告诉我为什么会这样,你可以获得奖励。我在不同的上下文中偶然发现了这个401错误(访问登台web服务)并且无法弄明白为什么。与登台相同的事情:我可以访问在浏览器中暂存Web服务的URL但不在Kentico内...非常奇怪)

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

长话短说,如何为我的小部件获取文档的呈现HTML?如果可能的话,它会让我的生活变得更轻松。

2 个答案:

答案 0 :(得分:2)

尝试以编程方式呈现页面内容可能非常麻烦。我会说WebClient的方法是唯一合理的方法。根据您的Kentico实例的身份验证方法,您必须提供正确的凭据集,以便您不会收到401错误。如果使用Windows身份验证,则需要使用NetworkCredential对象提供Web请求。如果您正在使用表单身份验证,则可以复制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");
    }
}

答案 1 :(得分:0)

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

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

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

    return page.Load(url);
}

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

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

希望它有所帮助!