Обработка запятой внутри значения cookie с использованием .net(С#) System.Net.Cookie

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

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

a,bcdefghijklmnop

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

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

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

--- EDIT ---

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

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

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

Где cookieJar определен в Program.client как:

CookieContainer cookieJar = new CookieContainer();

Когда я просматриваю все файлы cookie в CookieContainer, я получаю что-то вроде этого: (файлы cookie в формате: "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-заголовок в формате: "name" → "value" )

"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

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

Ответы

Ответ 1

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

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"]);
    }
}

Dont никогда не кодирует HTML-код в ASP.NET! Это приводит к появлению желтого экран смерти и исключение заявив, что файл cookie содержит опасных символов.

В MSDN также есть статья по этому вопросу.

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

Ответ 2

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

то есть:.

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

и аналогичным образом:

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