我似乎在从旧的经典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但我不想这样做,因为我认为我应该能够阅读这个东西。
关于如何使这项工作的任何想法或想法?
答案 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应该非常简单。