会话cookie - 堆栈上的CookieContainer而不是堆导致问题

时间:2013-04-16 11:40:46

标签: session cookies httpwebrequest cookiecontainer

我看过这里 C# WebRequest using Cookies Multiple WebRequest in same session Reuse Connection with HttpWebRequest in C# C# keep session id over httpwebrequest

这就是我正在做的事情,除了我希望将我的CookieContainer存储为我的类名为connector的成员(名为session_cookie)。我的问题是,如果我在我的代码中使用临时对象,那么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;
        }
    }    
}

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
        }
    }

}