обработка запятой внутри значения cookie с помощью .net (C #) System.Net.Cookie - PullRequest
14 голосов
/ 16 июля 2009

Я создаю клиента для посещения веб-сайта и входа в систему + автоматического выполнения некоторых задач, однако они недавно обновили свои куки-файлы, чтобы (по любой причине ...) содержать запятую в их идентификационном куки-файле.

Так, например, Cookie будет иметь значение, подобное этому:

a,bcdefghijklmnop

Проблема в том, что, согласно msdn , вы не можете использовать ни запятую, ни точку внутри значения cookie. То, что я ищу, - это способ обойти это ограничение, способ сделать работу .net Cookie'а приятной с запятыми. Я обнаружил, что сервер действительно отправляет заголовок «SET-COOKIE» клиенту, и я предполагаю, что это то, что анализируется, но это также, очевидно, придает особое значение запятым и точкам с запятой (таким образом, ограничение класс внутри самого .NET).

Но тогда как браузер, такой как IE, Firefox и т. Д. ... правильно обрабатывает cookie-файл (как они явно делают, поскольку веб-сайт работает нормально в любых браузерах, с которыми я его тестировал). Возможно, есть способ заставить это поведение в .NET?

Любая помощь будет оценена, спасибо.

--- РЕДАКТИРОВАТЬ ---

дополнительная информация:

Мой код выглядит примерно так:

request = (HttpWebRequest)WebRequest.Create(URI); 
request.CookieContainer = Program.client.cookieJar;

Где cookieJar определяется в Program.client как:

CookieContainer cookieJar = new CookieContainer();

Когда я зацикливаюсь и распечатываю все куки в CookieContainer, я получаю что-то вроде этого: (куки, в формате: "name" -> "value")

"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a" 
"bcdefghijklmnop" -> "" 

// What I should get is this: 
"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a,bcdefghijklmnop" 

Кажется, суть проблемы в том, что запятые и точки с запятой являются зарезервированными символами в строке заголовка SET-COOKIE ... но тогда как браузеры справляются с этим? Я, вероятно, могу разобрать строку самостоятельно, но я не знаю, как обойти ситуации, подобные этой: (заголовок HTTP, в формате: «имя» -> «значение»)

"Set-Cookie" -> "messedup_cookie=a,bcdefghijklmnop; path=/; domain=.domain.com; expires=Sat, 15-Aug-2009 09:14:24 GMT,anothervariable=i am the value;"

Как видите, в разделе expires вместо запятой вместо запятой используется запятая, чтобы отличаться от следующей переменной. Насколько я могу судить, это в формате:

cookie1_var1=value; cookie1_var2=value,cookie2_var1=value; cookir2_var2=value

Но если это правда, есть ли элегантный способ иметь дело с запятыми, которые могут встречаться внутри одного из значений?

Ответы [ 2 ]

8 голосов
/ 16 июля 2009

Согласно следующей статье , вы должны рассмотреть UrlEncode и UrlDecode для хранения значений в куки.

private void SetCookie()
{
    HttpCookie cookie = new HttpCookie("cookiename");
    cookie.Expires = DateTime.Now.AddMonths(24);
    cookie.Values.Add("name", Server.UrlEncode(txtName.Text));
    Response.Cookies.Add(cookie);
}

private void GetCookie()
{
    HttpCookie cookie = Request.Cookies["cookiename"];
    if (cookie != null)
    {
        txtName.Text = Server.UrlDecode(cookie.Values["name"]);
    }
}

Никогда HTML не кодирует куки в ASP.NET! Это приводит к желтому экран смерти и исключения заявляя, что печенье содержит опасные персонажи.

В MSDN также есть статья на эту тему.

ASP.NET не кодирует и не кодирует файлы cookie в формате UrlEncode дефолт. В результате вы можете столкнуться с неожиданным поведением в Приложения ASP.NET.

4 голосов
/ 16 июля 2009

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

т.е:.

Response.Cookies["Value1"] = Server.UrlEncode(sCookieValue);

и аналогично:

string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);
...