Pergunta

Eu quero túnel através de uma solicitação HTTP do meu servidor para um servidor remoto, passando por todos os cookies. Então eu criar um novo objeto HttpWebRequest e quer biscoitos set nele.

HttpWebRequest.CookieContainer é tipo System.Net.CookieContainer que detém System.Net.Cookies.

No meu objeto solicitação de entrada:

HttpRequest.Cookies é tipo System.Web.HttpCookieCollection que detém System.Web.HttpCookies.

Basicamente eu quero ser capaz de atribuir-lhes um ao outro, mas os tipos diferentes faz com que seja impossível. Eu tenho que convertê-los, copiando seus valores, ou se existe uma maneira melhor?

Foi útil?

Solução

Aqui está o código que usei para transferir os objetos do bolinho da solicitação de entrada para o novo HttpWebRequest ... ( "myRequest" é o nome do meu objeto 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 );
}

Outras dicas

Eu tinha uma necessidade de fazer isso hoje para um site do SharePoint que utiliza autenticação baseada em formulários (FBA). Se você tentar chamar uma página de aplicativo sem clonagem dos biscoitos e atribuindo um objeto CookieContainer em seguida, a solicitação falhará.

Eu escolhi para abstrair o trabalho a este método de extensão útil:

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;
        }
    }

Você pode, então, basta chamá-lo de qualquer objeto HttpRequest com um alvo HttpWebRequest objeto como um parâmetro, por exemplo:

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

onde TargetURL é o URL da página que eu sou depois e SourceRequest é o HttpRequest da página que eu estou no momento, recuperada através Page.Request.

O sugeriu a partir de David é o caminho certo. Você precisa copiar. Simplesmente criar função para copiar repetidamente. HttpCookie e objeto cookie é criado para se certificar de que podem se diferenciar tanto em sua funcionalidade e de onde ela veio. HttpCookie usado entre o usuário eo seu proxy cookie é utilizado entre o proxy e servidor web remoto.

HttpCookie tem menos funcionalidades desde o cookie é originado a partir de você e você sabe como lidar com isso. Cookie de fornecê-lo para gerenciar cookies recebidos de servidor web. Como CookieContainer, ele pode ser usado para gerenciar domínio, caminho e validade.

side usuário eo servidor web Então é diferente e para conectá-lo, com certeza você precisa convertê-lo. No seu caso, é atribuição simplesmente direta.

Observe que CookieContainer tem um bug no .Add (Cookie) e .GetCookies (URI) método.

Veja os detalhes e correção aqui:

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

CallMeLaNN

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top