从Sitecore项目获取呈现的HTML

时间:2015-04-23 19:39:10

标签: sitecore

我需要从给定的Sitecore项获取呈现的HTML输出,假设它具有布局。我需要它是已呈现内容的最新版本,无论它是否已发布。使用像WebClient或HtmlAgility包这样的Web请求方法是行不通的,因为它们将请求作为匿名用户进行,只会呈现最新发布的版本(无论状态如何,我都需要最新版本。)有什么想法吗?我有一切正常工作我无法在执行页面请求时找到冒充或提升权利的方法。

2 个答案:

答案 0 :(得分:4)

您可以使用WebClient或HtmlAgility包,但可以根据查询字符串中的标记静默登录用户:

pip install psycopg2 --ignore-installed

然后在HttpRequestProcessor中修补以查找令牌:

public static class UserExtensions
{
    public const string TokenKey = "UserToken";
    public const string TokenDateKey = "UserTokenDate";

    public static ID CreateUserToken(this User user)
    {
        if (user.IsAuthenticated)
        {
            var token = ID.NewID;
            user.Profile.SetCustomProperty(TokenKey, token.ToString());
            user.Profile.SetCustomProperty(TokenDateKey, DateTime.Now.ToString());
            user.Profile.Save();
            return token;
        }
        else
            return ID.Null;
    }

    public static bool IsTokenValid(this User user, string token, TimeSpan maxAge)
    {
        var tokenId = ID.Null;
        if (ID.TryParse(token, out tokenId))
        {
            var minDate = DateTime.Now.Add(-maxAge);
            var tokenDateString = user.Profile.GetCustomProperty(TokenDateKey);
            var tokenDate = DateTime.MinValue;

            DateTime.TryParse(tokenDateString, out tokenDate);

            if (tokenDate < minDate)
                return false;

            var storedToken = user.Profile.GetCustomProperty(TokenKey);
            var storedTokenId = ID.NewID;
            if (ID.TryParse(storedToken, out storedTokenId))
                return storedTokenId == tokenId;
        }

        return false;
    }
}

使用配置文件修补此内容:

public class SilentUserLogin : HttpRequestProcessor
{
    public TimeSpan MaximumAge
    {
        get;
        set;
    }

    public override void Process(HttpRequestArgs args)
    {
        var userValue = args.Context.Request.QueryString["user"];
        var tokenValue = args.Context.Request.QueryString["token"];

        if (!string.IsNullOrEmpty(userValue) && !string.IsNullOrEmpty(tokenValue))
        {
            // find user
            var user = User.FromName(userValue, AccountType.User);
            if (user != null)
            {
                // Check token is valid
                if ((user as User).IsTokenValid(tokenValue, MaximumAge))
                {
                    // log user in
                    AuthenticationManager.Login(user as User);
                }
                else
                    Log.Audit("User token has expired for user: '{0}'".FormatWith(user.Name), this);
            }
            else
                Log.Audit("Failed to locate auto login user " + userValue, this);
        }
    }

最后,通过WebClient或HtmlAgility调用页面:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <pipelines>
            <httpRequestBegin>
                <processor type="Namespace.SilentUserLogin,Assembly" patch:after="*[@type='Sitecore.Pipelines.HttpRequest.StartMeasurements, Sitecore.Kernel']">
                    <MaximumAge>00:02:00</MaximumAge>
                </processor>
            </httpRequestBegin>
        </pipelines>
    </sitecore>
</configuration>

此代码在类似的情况下受到限制,我需要一个URL来提供给PDF生成库,后者在幕后启动IE并以匿名用户身份访问该网站。这样我们就可以通过查询字符串传递有限时间的安全令牌。

答案 1 :(得分:0)

您可以设置一个“预览”网站,该网站显示master数据库中的内容,而不是面向公众的已发布内容。本文将帮助您进行设置:How to Setup a Sitecore Preview Site to Review Content Before Publishing

在唯一网址上进行此设置后,您可以对页面进行WebRequest或使用HtmlAgilityPack。