【问题标题】:Where do I set cookies when my web application receives an HttpRequest?当我的 Web 应用程序收到 HttpRequest 时,我在哪里设置 cookie?
【发布时间】:2012-07-31 12:31:09
【问题描述】:

我需要在我的 C# 代码中的什么位置放置设置 cookie 的代码?当我登录系统时,Firefox 显示三个 cookie。

登录页面

system.local/interface/Login.php

POST /interface/Login.php HTTP/1.1
Host: system.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://system.local/interface/Login.php
Cookie: language=en_US.UTF-8; StationID=06ae3ed4d72a33dd951572df84a13725
Content-Type: application/x-www-form-urlencoded
Content-Length: 71
user_name=user&password=password123456&language=en&action%3Asubmit=Submit

登录时从 index.php 获取响应

http://system.local/interface/index.php

GET /interface/index.php HTTP/1.1
Host: system.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: system.local/interface/Login.php  
Cookie: language=en_US.UTF-8; StationID=06ae3ed4d72a33dd951572df84a13725; SessionID=3783a8fea972fb99779f7dd3078ed53c

将 cookie 放在这段代码中的什么位置?

string url;
string cookieHeader;
string formparam;
HttpWebRequest request;
HttpWebResponse response;
byte[] bytes;

url = "http://system.local/interface/Login.php";
formparam = string.Format("user_name=" + textBox1.Text + "&password=" + textBox2.Text + "&language=en&action%3Asubmit=Submit");
request = (HttpWebRequest)HttpWebRequest.Create(url);
var cookies = new CookieContainer();
request.ContentType = "Content-Type: application/x-www-form-urlencoded";
request.Method = "POST";
bytes = Encoding.ASCII.GetBytes(formparam);
request.ContentLength = bytes.Length;
request.KeepAlive = true;

using (Stream os = request.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}

response = (HttpWebResponse)request.GetResponse();
cookieHeader = response.Headers["Set-Cookie"];


request = (HttpWebRequest)WebRequest.Create("http://system.local/interface/Login.php");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(response.Cookies);
request.Headers.Add("Cookie", cookieHeader);

response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    //richTextBox1.Text = reader.ReadToEnd().Trim();
}

【问题讨论】:

    标签: c# post cookies httpwebrequest set


    【解决方案1】:

    在每个request 上设置CookieContainer 字段,它应该会自动从标题添加cookie。每次都使用相同的CookieContainer 实例,它将在多个请求中保持其状态。您不需要弄乱Cookieset-cookie 标头值,因为CookieContainer 会在分配给请求cookie 容器时自动处理。

    var cookies = new CookieContainer();
    
    request.CookieContainer = cookies;
    ...
    response = (HttpWebResponse)request.GetResponse();
    // no need to manually read Cookie header, CookieContainer handles that.
    
    request = ...
    request.CookieContainer = cookies;
    // no need to manually set/populate CookieContainer, just use the same instance.
    ...
    response = (HttpWebResponse)request.GetResponse();
    // etc
    

    【讨论】:

    • 这对我不起作用。 Getresponse 导致错误'无法解析远程名称:'system.local'
    • 嗯,您的网络请求也必须有一个有效的 url。 system.local 指向哪里?
    • system.local 是位于网络中的站点。现在可以了。谢谢
    【解决方案2】:

    我的问题现在解决了。
    我刚写了新的,效果很奇怪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2016-04-21
      • 2015-01-20
      • 2011-05-15
      相关资源
      最近更新 更多