使用SimpleWorkerRequest加载页面时如何访问会话变量?

时间:2011-03-31 21:50:19

标签: asp.net security session

我正在将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。

任何人都有更好的主意吗?

1 个答案:

答案 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请求。