Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebResponse不返回任何cookies_C#_Cookies_Httpwebrequest_Webrequest - Fatal编程技术网

C# WebResponse不返回任何cookies

C# WebResponse不返回任何cookies,c#,cookies,httpwebrequest,webrequest,C#,Cookies,Httpwebrequest,Webrequest,我目前正在开发一个类,它可以帮助我创建带有cookies和POST参数的WebRequest。但是response.cookies总是空的。我如何获取返回的cookies并在下一次请求时发送它们 class WebHandler { private string lasturl = ""; private Dictionary<string, Cookie> cookies; public string lastContent; public Web

我目前正在开发一个类,它可以帮助我创建带有cookies和POST参数的WebRequest。但是response.cookies总是空的。我如何获取返回的cookies并在下一次请求时发送它们

class WebHandler
{
    private string lasturl = "";
    private Dictionary<string, Cookie> cookies;
    public string lastContent;

    public WebHandler()
    {
        cookies = new Dictionary<string, Cookie>();
    }

    public HttpWebResponse request(string address)
    {
        lasturl = address;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
        foreach (KeyValuePair<string, Cookie> pair in this.cookies)
        {
            Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value);
            request.CookieContainer.Add(pair.Value);
        }
        request.Method = "GET";
        if(lasturl != "")
            request.Referer = lasturl;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        foreach (Cookie newCookie in response.Cookies)
        {
            Console.WriteLine(" new cookie: " + newCookie.Name + " = " + newCookie.Value);
            this.cookies[newCookie.Name] = newCookie;
        }
        lastContent = new StreamReader(response.GetResponseStream()).ReadToEnd();
        return response;
    }

    public HttpWebResponse request(string address, Dictionary<string, string> postParameters)
    {
        lasturl = address;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
        foreach (KeyValuePair<string, Cookie> pair in this.cookies)
        {
            Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value);
            request.CookieContainer.Add(pair.Value);
        }
        request.Method = "POST";

        string postData = "";
        foreach (string key in postParameters.Keys)
            postData += HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(postParameters[key]) + "&";


        byte[] data = Encoding.ASCII.GetBytes(postData);
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        foreach (Cookie newCookie in response.Cookies)
        {
            Console.WriteLine(" new cookie: " + newCookie.Name + " = " + newCookie.Value);
            this.cookies[newCookie.Name] = newCookie;
        }
        lastContent = new StreamReader(response.GetResponseStream()).ReadToEnd();
        return response;
    }
}
类WebHandler
{
私有字符串lasturl=“”;
私人字典曲奇;
公共内容;
公共WebHandler()
{
cookies=新字典();
}
公共HttpWebResponse请求(字符串地址)
{
lasturl=地址;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(地址);
foreach(此.cookies中的KeyValuePair对)
{
Console.WriteLine(“发送的cookie:+pair.Value.Name+”=“+pair.Value.Value”);
request.CookieContainer.Add(pair.Value);
}
request.Method=“GET”;
如果(lasturl!=“”)
request.Referer=lasturl;
HttpWebResponse=(HttpWebResponse)request.GetResponse();
foreach(响应中的Cookie newCookie.Cookies)
{
Console.WriteLine(“新cookie:+newCookie.Name+”=“+newCookie.Value”);
this.cookies[newCookie.Name]=newCookie;
}
lastContent=newstreamreader(response.GetResponseStream()).ReadToEnd();
返回响应;
}
公共HttpWebResponse请求(字符串地址、字典后参数)
{
lasturl=地址;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(地址);
foreach(此.cookies中的KeyValuePair对)
{
Console.WriteLine(“发送的cookie:+pair.Value.Name+”=“+pair.Value.Value”);
request.CookieContainer.Add(pair.Value);
}
request.Method=“POST”;
字符串postData=“”;
foreach(postParameters.Keys中的字符串键)
postData+=HttpUtility.UrlEncode(键)+“=”+HttpUtility.UrlEncode(后参数[key])+”&”;
byte[]data=Encoding.ASCII.GetBytes(postData);
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=data.Length;
Stream requestStream=request.GetRequestStream();
requestStream.Write(数据,0,数据长度);
requestStream.Close();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
foreach(响应中的Cookie newCookie.Cookies)
{
Console.WriteLine(“新cookie:+newCookie.Name+”=“+newCookie.Value”);
this.cookies[newCookie.Name]=newCookie;
}
lastContent=newstreamreader(response.GetResponseStream()).ReadToEnd();
返回响应;
}
}

如果
HttpWebResponse
对象的
Cookies
集合为空,则表示响应没有新Cookies。要访问请求和响应的所有cookie,请改为从
HttpWebRequest
对象读取cookie,如下所示:

foreach (Cookie newCookie in request.Cookies)
{
    // Do something with cookies here for next request
}

由于
this.cookies
最初为空,因此您的代码永远不会进入循环

foreach (KeyValuePair<string, Cookie> pair in this.cookies)
{
     Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value);
     request.CookieContainer.Add(pair.Value);
}
之后


PS:您可能想了解c#中的命名约定


PS2:在方法
request
中,使用变量名
request
并不能提高可读性。

我也有同样的问题,所以我添加了
request.AllowAutoRedirect=false,现在我可以获取cookies:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
...
request.Method = "POST";
request.AllowAutoRedirect=false;

我想我会在响应中得到所有cookies,并且必须在下一个请求中放入相同的cookies?您的示例显示请求中的所有cookie(这意味着没有cookie,因为没有人设置它们)。我想保留旧响应中的cookies,并将其添加到下一个请求中!如果请求中没有cookie,响应中没有cookie,那么就永远不会有cookie。但是现在我可以接收cookie并将添加到下一个请求中,但是我的php脚本没有看到任何cookie(但在浏览器中一切正常)。我可能要处理域?非常奇怪的行为…响应对象有一个非空的cookie容器,但没有cookie。这确实有效。如果有重定向,那么是的,你不会得到任何cookies,尝试解析响应头,你会看到cookies,
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
...
request.Method = "POST";
request.AllowAutoRedirect=false;