从 Sitecore 项目中获取 HTML
Get Rendered HTML From Sitecore Item
我需要从给定的 Sitecore 项目获取呈现的 HTML 输出,假设它有布局。我需要它是渲染内容的最新版本,无论它是否发布。使用像 WebClient 或 HtmlAgility pack 这样的网络请求方法是行不通的,因为它们以匿名用户的身份发出请求,这只会呈现最新发布的版本(无论状态如何,我都需要最新版本。)有什么想法吗?我一切正常我只是找不到在执行页面请求时模拟或提升权限的方法。
您可以设置一个 "preview" 站点来显示来自 master
数据库的内容,而不是面向 public 的已发布内容。本文将帮助您进行设置:How to Setup a Sitecore Preview Site to Review Content Before Publishing
在独特的 URL 上完成此设置后,您就可以 WebRequest
页面或使用 HtmlAgilityPack。
您可以使用 WebClient 或 HtmlAgility 包,但基于查询字符串中的令牌静默登录用户:
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;
}
}
然后修补 HttpRequestProcessor 以查找令牌:
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);
}
}
使用配置文件对其进行修补:
<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>
最后,通过WebClient或HtmlAgility调用页面:
var token = Sitecore.Context.User.CreateUserToken();
var url = new UrlString();
url.HostName = HttpContext.Current.Request.Url.Host;
url.Protocol = HttpContext.Current.Request.IsSecureConnection ? "https" : "http";
url.Path = "/";
url["sc_itemid"] = myItem.ID.ToString();
url["sc_lang"] = myItem.Language.ToString();
// Add parameters to allow accessing the master DB
url["user"] = Sitecore.Context.User.Name;
url["token"] = token.ToString();
// Call the url here
这段代码是从我需要一个 URL 来提供给 PDF 生成库的类似情况中抄袭的,它在幕后启动了 IE 并以匿名用户的身份访问了该网站。这样我们就可以通过查询字符串传递限时安全令牌。
我需要从给定的 Sitecore 项目获取呈现的 HTML 输出,假设它有布局。我需要它是渲染内容的最新版本,无论它是否发布。使用像 WebClient 或 HtmlAgility pack 这样的网络请求方法是行不通的,因为它们以匿名用户的身份发出请求,这只会呈现最新发布的版本(无论状态如何,我都需要最新版本。)有什么想法吗?我一切正常我只是找不到在执行页面请求时模拟或提升权限的方法。
您可以设置一个 "preview" 站点来显示来自 master
数据库的内容,而不是面向 public 的已发布内容。本文将帮助您进行设置:How to Setup a Sitecore Preview Site to Review Content Before Publishing
在独特的 URL 上完成此设置后,您就可以 WebRequest
页面或使用 HtmlAgilityPack。
您可以使用 WebClient 或 HtmlAgility 包,但基于查询字符串中的令牌静默登录用户:
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;
}
}
然后修补 HttpRequestProcessor 以查找令牌:
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);
}
}
使用配置文件对其进行修补:
<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>
最后,通过WebClient或HtmlAgility调用页面:
var token = Sitecore.Context.User.CreateUserToken();
var url = new UrlString();
url.HostName = HttpContext.Current.Request.Url.Host;
url.Protocol = HttpContext.Current.Request.IsSecureConnection ? "https" : "http";
url.Path = "/";
url["sc_itemid"] = myItem.ID.ToString();
url["sc_lang"] = myItem.Language.ToString();
// Add parameters to allow accessing the master DB
url["user"] = Sitecore.Context.User.Name;
url["token"] = token.ToString();
// Call the url here
这段代码是从我需要一个 URL 来提供给 PDF 生成库的类似情况中抄袭的,它在幕后启动了 IE 并以匿名用户的身份访问了该网站。这样我们就可以通过查询字符串传递限时安全令牌。