asp.net阅读经典的asp cookie

时间:2014-10-14 17:08:55

标签: asp.net cookies asp-classic

我似乎在从旧的经典asp web应用程序中读取cookie时遇到很多问题。我们正在慢慢将此Web应用程序升级到.net。 Cookie包含一些用户信息,这些信息也用于告诉应用程序该用户已成功进行身份验证。

我试着这样读:

Response.Cookies["mycookie"].Path = "/";
string strCookieText = Request.Cookies["mycookie"].Value;

有时它似乎会将数据带回其他时间但不是一致的。我还尝试在经典的asp端创建cookie时应用相同的路径,但这似乎真的在旧应用程序中引发了一个扳手,因为经典的asp方面在阅读和查找cookie时遇到了很多挑战。

所以我想我会创建一个函数,它将在经典的asp页面中读取,其唯一目的是读取cookie。我根本不喜欢这种方法,但此时我已经没有想法了。这里的问题似乎是它总是空洞的。我知道那里有数据通过提琴手,如果我去实际网站并点击页面。我猜这可能是一些路径问题或者类似的东西,当我尝试通过.net读它时,它什么都没发现。

这是我试图阅读页面的功能:

 public CCookie validateCookie()
    {
        CCookie ckCCookie = new CCookie();

        string strReadCookiePage = "";
        strReadCookiePage = GetHtmlPage("HTTP://MYPAGE/readcookie.asp");


        string[] strCarriageReturn = { "\n" };   //we are splitting on this character
        string[] strPageSplit;

        strPageSplit = strReadCookiePage.Split(strCarriageReturn, StringSplitOptions.RemoveEmptyEntries);

        string strCookieLength = "-2";

        foreach (string strValue in strPageSplit)
        {
            if (strCookieLength == "-1")
            {
                break;
            }

            if (strValue.Contains("<div id='arrayLength'>"))
            {
                strCookieLength = findStringValue(strValue, "<div id='arrayLength'>", "</div>");
            }
            if (strValue.Contains("<div id='VendorID'>"))
            {
                ckCCookie.UserVendorID = findStringValue(strValue, "<div id='VendorID'>", "</div>");
            }
            if (strValue.Contains("<div id='UserID'>"))
            {
                ckCCookie.UserID = Convert.ToInt64(findStringValue(strValue, "<div id='UserID'>", "</div>"));
            }
            if (strValue.Contains("<div id='LogonType'>"))
            {
                ckCCookie.LogonType = findStringValue(strValue, "<div id='LogonType'>", "</div>");
            }
            if (strValue.Contains("<div id='UserType'>"))
            {
                ckCCookie.UserType = findStringValue(strValue, "<div id='UserType'>", "</div>");
            }
        }

        //not able to validate the cookie
        if (strCookieLength == "-1")
        {

           //Response.Redirect("REDIRECT TO HAVE THEM LOG IN");
        }

        return ckCCookie;
    }

为什么你们没有想到这个工作呢?我需要这一点来持续工作。我知道我可以将状态保存到dbase但我不想这样做,因为我认为我应该能够阅读这个东西。

关于如何使这项工作的任何想法或想法?

1 个答案:

答案 0 :(得分:0)

由于存储cookie的方式,它们通常不能在应用程序之间共享,例如经典ASP到ASP.NET。

我确实找到了讨论问题解决方案的this article on MSDN

就个人而言,我会使用隐藏字段方法将cookie传递过来,从另一端的相关控件(ASP.NET)中提取它。

- 编辑 -

只要隐藏控件驻留在您的form标签中,您就可以尝试这样的事情(这几乎就是ASP.NET为它做的事情__VIEWSTATE)。

<form id="myForm" method="post" action="myAspNetPage.aspx">
    <all_the_controls_i_need_on_my_form>
        ...
        ...
    </all_the_controls_i_need_on_my_form>
    <input id="cookieData" name="cookieData" type="hidden" value="<%= cookieData %>" />
</form>

VBScript ......

Dim cookieData
cookieData = Request.Cookie("MyCookie")

显然,如果你想以这种方式传递几个cookie,那么你可能需要将它们连接起来以便以后拆分......

Const C_SEPERATOR = "|"
Dim cookieData
cookieData = _
    "MyCookie1=" & Request.Cookie("MyCookie1") & C_SEPERATOR & _
    "MyCookie2=" & Request.Cookie("MyCookie2") & C_SEPERATOR & _
    "MyCookie3=" & Request.Cookie("MyCookie3") & C_SEPERATOR & _
    "MyCookie4=" & Request.Cookie("MyCookie4")

上面的示例显然可以通过引入For..Next循环来实现自动化,但这只是一个示例。另请注意,我只是理所当然地认为您的cookie都没有使用竖线字符(C_SEPERATOR);如果他们这样做,那么你必须找到另一个角色。

另一方面,在您的ASP.NET应用程序中,您可以从帖子数据中读取值并将其拆分......

Private Const C_SEPARATOR = "|"
...
...
Dim tCook As String = Request.Form("cookieData")
Dim cookeiData() As String
If tCook<>"" Then  cookieData = String.Split(tCook, C_SEPERATOR)

这不是最好的解决方案 - 我确信Lankymart会有更好的东西,但这样做会有效。

PS:道歉 - 我刚刚意识到我已经在VBScript中完成了所有这些工作。不过,转换为JScript应该非常简单。