2013-04-16 5 views
0

У меня было посмотреть здесь C# WebRequest using Cookies Multiple WebRequest in same session Reuse Connection with HttpWebRequest in C# C# keep session id over httpwebrequestпеченье Session - CookieContainer на стеке, а не куча вызывает вопрос

И вот что я делаю только я хочу, чтобы сохранить свою CookieContainer в качестве члена (named session_cookie) в моем классе, называемом коннектором. Моя проблема заключается в том, что если я использую временный объект в моем коде, тогда печенье работает отлично:

CookieContainer t = new CookieContainer(); 
HTTPReq = (HttpWebRequest)WebRequest.Create(scriptURL); 
HTTPReq.CookieContainer = t; 

Но если я использую

HTTPReq = (HttpWebRequest)WebRequest.Create(scriptURL); 
HTTPReq.CookieContainer = session_cookie; 

Тогда он не работает! Я не могу понять, почему

Вот код класса разъем:

public class Connector 
{ 
    public CookieContainer session_cookie; 
    private string session_id; 
    private HttpWebRequest HTTPReq; 
    private HttpWebResponse Response; 

    //Session oriented connection 
    public string serverRequest(string scriptURL, string payLoad) 
    { 
     try 
     { 
      HTTPReq = (HttpWebRequest)WebRequest.Create(scriptURL); 
     HTTPReq.CookieContainer = session_cookie; 
     HTTPReq.Method = "POST";      

     //Data arguments 
     byte[] byteArray = Encoding.UTF8.GetBytes(payLoad); 
     HTTPReq.ContentType = "application/x-www-form-urlencoded"; 
     HTTPReq.ContentLength = byteArray.Length; 

     //Get the stream to write into 
     Stream dataStream = HTTPReq.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

     Response = (HttpWebResponse)HTTPReq.GetResponse(); 

     Encoding enc = Encoding.GetEncoding(1252); // Western latin alphabet (windows default) 

     //Get the repsonse from the server 
     StreamReader ResponseStream = new StreamReader(Response.GetResponseStream(), enc); 

     string response = ResponseStream.ReadToEnd().Trim(); 

     Response.Close(); 
     ResponseStream.Close(); 
     return response; 
     } 
     catch (WebException ex) 
     { 
     Console.WriteLine(ex.ToString()); 
     return null; 
     } 
    }  
} 

Любые идеи?

ответ

0

Вам не хватает конструктора для вашего класса Connector, который должен инициализировать свойство CookieContainer. Вы также должны использовать CookieCollection для захвата файлов cookie из ответа и отправки следующего запроса. Что-то вроде этого должно работать:

public class Connector 
{ 
    public CookieContainer session_cookie; 
    private CookieCollection cookies; 
    private string session_id; 
    private HttpWebRequest HTTPReq; 
    private HttpWebResponse Response; 

    public Connector() 
    { 
     session_cookie = new CookieContainer(); 
     cookies = new CookieCollection(); 
    } 

    //Session oriented connection 
    public string serverRequest(string scriptURL, string payLoad) 
    { 
     try 
     { 
     HTTPReq = (HttpWebRequest)WebRequest.Create(scriptURL); 
     HTTPReq.CookieContainer = session_cookie; 
      HTTPReq.CookieContainer.Add(cookies); 
     HTTPReq.Method = "POST";      

     //Data arguments 
     byte[] byteArray = Encoding.UTF8.GetBytes(payLoad); 
     HTTPReq.ContentType = "application/x-www-form-urlencoded"; 
     HTTPReq.ContentLength = byteArray.Length; 

     //Get the stream to write into 
     Stream dataStream = HTTPReq.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

     Response = (HttpWebResponse)HTTPReq.GetResponse(); 
      cookies = Response.Cookies; // capture cookies from response for next request 

     Encoding enc = Encoding.GetEncoding(1252); // Western latin alphabet (windows default) 

     //Get the repsonse from the server 
     StreamReader ResponseStream = new StreamReader(Response.GetResponseStream(), enc); 

     string response = ResponseStream.ReadToEnd().Trim(); 

     Response.Close(); 
     ResponseStream.Close(); 
     return response; 
     } 
     catch (WebException ex) 
     { 
     Console.WriteLine(ex.ToString()); 
     return null; 
     } 
    } 

} 
Смежные вопросы