我正在将ASPX文件作为字符串读取,并使用返回的HTML作为电子邮件的来源。这是代码:
public string GetEmailHTML(int itemId)
{
string pageUrl = "HTMLEmail.aspx";
StringWriter stringWriter = new StringWriter();
HttpRuntime.ProcessRequest(new SimpleWorkerRequest(pageUrl, "ItemId=" + itemId.ToString(), stringWriter));
stringWriter.Flush();
stringWriter.Close();
return stringWriter.ToString();
}
HTMLEmail.aspx使用ItemId查询字符串变量从数据库加载数据并使用结果填充页面。我需要保护HTMLEmail.aspx页面,以便操作的查询字符串不允许任何人查看结果。
我像这样存储当前用户:
public User AuthenticatedUser
{
get { return Session["User"] as User; }
set { Session["User"] = value; }
}
由于页面请求不是由浏览器直接创建的,而是SimpleWorkerRequest,因此没有发布的SessionId,因此HTMLEmail.aspx无法访问任何会话变量。至少,我认为这就是问题所在。
我在这里阅读了有关会话变量的概述:http://msdn.microsoft.com/en-us/library/ms178581.aspx
我想知道是否需要实现自定义会话标识符。我可以在GetEmailHTML方法中获取当前的SessionId,并将其作为查询字符串参数传递给HTMLEmail.aspx。如果我在HTMLEmail.aspx中有SessionId,我可以使用自定义会话标识符来访问会话变量。
那个修复听起来很混乱。它还删除了自动应用于SessionId的加密层ASP。
任何人都有更好的主意吗?
答案 0 :(得分:1)
据我所知,您最好的办法是通过查询参数将 HTMLEmail.aspx 中所需的所有值传递给它,就像使用ItemId
一样
除此之外,你可能只需将用户的UserId
发送到该页面,然后将其命中到数据库(或存储用户的任何位置),即可User
对象,而不是尝试从Session变量读取它。
你为什么不用:
public string GetEmailHTML(int itemId)
{
string pageUrl = "HTMLEmail.aspx";
StringWriter stringWriter = new StringWriter();
Server.Execute(pageUrl, stringWriter);
stringWriter.Flush();
stringWriter.Close();
return stringWriter.ToString();
}
代替?至于I can see Server.Execute
继承相同的http请求。