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

StackOverflow https://stackoverflow.com/questions/1214387

Вопрос

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

HttpWebRequest.CookieContainer является типом System.Net.CookieContainer который удерживает System.Net.Cookies.

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

HttpRequest.Cookies является типом System.Web.HttpCookieCollection который удерживает System.Web.HttpCookies.

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

Это было полезно?

Решение

Вот код, который я использовал для передачи объектов 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 );
}

Другие советы

Мне нужно было сделать это сегодня для сайта 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 страницы, на которой я сейчас нахожусь, полученной через Page.Request.

Предложение Дэвида является правильным.Вам нужно скопировать.Просто создайте функцию для повторного копирования.Объект 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

Позвони Меланну

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top