Поправьте меня, если я ошибаюсь в своих мыслях.
Насколько я понимаю, любой новый экземпляр класса WebClient начнет новый сеанс, генерируя новый идентификатор сеанса.
Чтобы предотвратить это, я должен получить идентификатор сеанса при первом использовании, а затем передать его всем новым экземплярам WebClients. (Для метода "GET" просто можно добавить в запрос как любой другой параметр)
Теоретически это можно сделать с помощью класса, например:
public class ExtendedWebClient : WebClient
{
public CookieContainer CookieContainer { get; private set; }
[SecuritySafeCritical]
public ExtendedWebClient()
{
this.CookieContainer = new CookieContainer();
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
(request as HttpWebRequest).CookieContainer = this.CookieContainer;
return request;
}
}
Однако это не работает с jsessionid cookie, у этого подхода есть две проблемы.
- Я не вижу значение jsessionid в сохраненном CookieContainer.
- Даже если я получу это значение с использованием другого подхода, например, нижеприведенного, а затем добавлю это значение в URI запроса как & jsessionid = someValue, это не поможет.
Я проверял несколько раз, и каждый раз, когда я отправляю такой запрос в Windows Phone, ответ имеет другой уникальный идентификатор jsessionid.
Однако, если я напишу такой запрос в браузере, ответ вернется с правильным jsessionid.
Следующий код позволяет получить значение jsessionid из ответа в Windows Phone (использует HttpWebRequest вместо WebClient), но не решает проблему:
// working with some uri
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.BeginGetResponse(asynchronousResult =>
{
try
{
using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
{
CookieCollection cookies = response.Cookies;
foreach (Cookie c in cookies)
{
if (c.Name == "JSESSIONID")
// jsessionid value is here. Can be saved & stored somewhere
}
response.Close();
}
catch (Exception e)
{
// handling exception somehow
}
}
, request);