Подтвердить что ты не робот

Отправка файлов cookie с использованием HttpCookieCollection и CookieContainer

Я хочу туннелировать через HTTP-запрос с моего сервера на удаленный сервер, проходя через все файлы cookie. Поэтому я создаю новый объект HttpWebRequest и хочу установить на нем файлы cookie.

HttpWebRequest.CookieContainer - это тип System.Net.CookieContainer, который содержит System.Net.Cookies.

В моем объекте входящего запроса:

HttpRequest.Cookies - это тип System.Web.HttpCookieCollection, который содержит System.Web.HttpCookies.

В основном я хочу иметь возможность назначать их друг другу, но разные типы делают невозможным. Должен ли я преобразовать их, скопировав их значения, или есть лучший способ?

4b9b3361

Ответ 1

Здесь код, который я использовал для переноса объектов cookie из входящего запроса на новый HttpWebRequest... ( "myRequest" - это имя моего объекта HttpWebRequest.)

HttpCookieCollection oCookies = Request.Cookies;
for ( int j = 0; j < oCookies.Count; j++ ) 
{
    HttpCookie oCookie = oCookies.Get( j );
    Cookie oC = new Cookie();

    // Convert between the System.Net.Cookie to a System.Web.HttpCookie...
    oC.Domain   = myRequest.RequestUri.Host;
    oC.Expires  = oCookie.Expires;
    oC.Name     = oCookie.Name;
    oC.Path     = oCookie.Path;
    oC.Secure   = oCookie.Secure;
    oC.Value    = oCookie.Value;

    myRequest.CookieContainer.Add( oC );
}

Ответ 2

Мне нужно было сделать это сегодня для сайта SharePoint, который использует аутентификацию на основе форм (FBA). Если вы попытаетесь вызвать страницу приложения без клонирования файлов cookie и назначить объект CookieContainer, запрос будет терпеть неудачу.

Я решил абстрагировать задание на этот удобный метод расширения:

public static CookieContainer GetCookieContainer(this System.Web.HttpRequest SourceHttpRequest, System.Net.HttpWebRequest TargetHttpWebRequest)
    {
        System.Web.HttpCookieCollection sourceCookies = SourceHttpRequest.Cookies;
        if (sourceCookies.Count == 0)
            return null;
        else
        {
            CookieContainer cookieContainer = new CookieContainer();
            for (int i = 0; i < sourceCookies.Count; i++)                
            {
                System.Web.HttpCookie cSource = sourceCookies[i];
                Cookie cookieTarget = new Cookie() { Domain = TargetHttpWebRequest.RequestUri.Host, 
                                                     Name = cSource.Name, 
                                                     Path = cSource.Path, 
                                                     Secure = cSource.Secure, 
                                                     Value = cSource.Value };
                cookieContainer.Add(cookieTarget);
            }
            return cookieContainer;
        }
    }

Затем вы можете просто вызвать его из любого объекта HttpRequest с целевым объектом HttpWebRequest в качестве параметра, например:

HttpWebRequest request;                
request = (HttpWebRequest)WebRequest.Create(TargetUrl);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.CookieContainer = SourceRequest.GetCookieContainer(request);                
request.BeginGetResponse(null, null);

где TargetUrl - это Url страницы, с которой я столкнулся, и SourceRequest - это HttpRequest страницы, на которой я нахожусь, в настоящее время, полученной через страницу. Request.

Ответ 3

Предлагаемый Дэвидом правильный. Вам нужно скопировать. Просто просто создайте функцию для копирования повторно. Объект HttpCookie и Cookie создан, чтобы мы могли различать как функциональность, так и место. HttpCookie, используемый между пользователем и вашим прокси файлом Cookie, используется между вашим прокси-сервером и удаленным веб-сервером.

HttpCookie имеет меньшую функциональность, поскольку cookie происходит от вас, и вы знаете, как с ним справиться. Cookie предоставляет вам управление cookie, полученным с веб-сервера. Как и CookieContainer, он может использоваться для управления доменом, путем и истечением срока действия.

Таким образом, сторона пользователя и веб-сервера отличается и для ее подключения, поэтому вам необходимо ее преобразовать. В вашем случае это просто просто назначение.

Обратите внимание, что CookieContainer имеет ошибку в методах .Add(Cookie) и .GetCookies(uri).

Подробности см. здесь:

http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

CallMeLaNN