2014-10-14 4 views
0

У меня, похоже, много проблем, читая куки из старого классического веб-приложения asp. мы медленно обновляем это веб-приложение до .net. Файл cookie содержит некоторую пользовательскую информацию, которая также используется, чтобы сообщить приложению, что человек успешно прошел аутентификацию.asp.net read classic asp cookie

Я стараюсь читать так:

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

Иногда, кажется, приносит данные обратно в другое время нет, но это не соответствует. Я также попытался применить тот же путь, когда cookie создан на классической стороне asp, но это, казалось, действительно запустило ключ в старом приложении, так как тогда классическая сторона asp имела множество проблем с чтением и поиском файла cookie.

Итак, я решил, что создам функцию, которая будет читаться на классической странице asp, цель которой - прочитать cookie. Мне совсем не нравится этот метод, но на данный момент у меня нет идей. Проблема здесь в том, что она всегда возвращается пустой. Я знаю, что есть данные, однако, через скрипач, и если я пойду на фактический сайт и попаду на страницу. Я предполагаю, что это, должно быть, еще одна проблема, возможно, или что-то в этом роде, когда я пытаюсь прочитать ее через .net, она ничего не находит.

вот мой Funciton, что пробует читать страницу:

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

Из-за способа хранения файлов cookie они обычно не могут использоваться совместно с приложениями, такими как классический ASP для ASP.NET.

Я нашел this article on MSDN, который обсуждает решения проблемы.

Лично я использовал бы метод скрытого поля, чтобы передать куки-файл, выбирая его из соответствующего элемента управления с другой стороны (ASP.NET).

- EDIT -

Просто так долго, как скрытое управление находится в вас 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") 

Очевидно, что если у вас есть несколько кухарку х годов, которые вы хотите передать таким образом, то вам, возможно, потребуется объединить их для разделения позже ...

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 должно быть довольно просто.

+1

Они должны быть в состоянии прочитать его, если это обычный файл cookie (не файл cookie сеанса), независимо от приложения, если нет, например, атрибута 'domain' или' path'. – Lankymart

+0

Хорошая точка. Я только что принял файл cookie на основе сеанса, следовательно, ссылку. (Я знаю - никогда не предполагаю, что он делает задницу у и меня!) – Paul

+0

Спасибо за ответы. нет пути или домена, поэтому я бы догадался (не предположим, предположил.;), что я должен их прочитать). Что касается скрытого поля, у вас есть пример, как это работает? Я тоже должен был упомянуть, что это страница на основе фреймов. Я думаю, я мог бы немного смутить, как я буду читать скрытые значения из верхнего кадра, скажем, – bline22