现在的情况是:可以正常监听客户端发来的请求,当请求中的cookie就一个JSESSIONID=AA12CB32ED12ED12ED12ED12ED33ED78时,可以正确取出该cookie,但当JSESSIONID有两个,就只能取出一个了
例如抓包看到的HTTP头中的Cookie字段为:
JSESSIONID=AA12CB32ED12ED12ED12ED12ED33ED78;JSESSIONID=ED12BB32CC12AD12ED12ED12ED12ED12;利用下面代码去取:HttpListenerContext httpContext;
//此处省略HttpListenerContext部分监听代码
...
HttpListenerRequest request
request = httpContext.request;//遍历所有cookie
foreach(Cook cooks in request.cookies)
{
  ...
}这里调试发现 request.cookies的count只有1,也就是只能取出其中一个JSESSIONID。但是同样功能的代码用Java去写就可以读出正确的2个cookie,难道这是C#语言的BUG?求高人指点

解决方案 »

  1.   

    既然request.cookies的count=1 JSESSIONID=AA12CB32ED12ED12ED12ED12ED33ED78;JSESSIONID=ED12BB32CC12AD12ED12ED12ED12ED12;你把这个用Split分隔开  再读取试试。
      

  2.   

    可能我说的不太清楚“JSESSIONID=AA12CB32ED12ED12ED12ED12ED33ED78;JSESSIONID=ED12BB32CC12AD12ED12ED12ED12ED12”是抓包看到的,并不是在程序中的request.cookies看到的,程序中request.cookies的值只是其中一个JSESSIONID,并不是一个包含两个的长字符串,另外也做过测试,如果Cookie中的内容是如下格式
    “JSESSIONID=AA12CB32ED12ED12ED12ED12ED33ED78;USER_PASS=TEST”
    这种情况下request.cookies的count=2,并且可以正确取出JSESSIONID和USER_PASS两个cookie,我现在怀疑C#的这个类不允许同样NAME的cookie出现多次,因为自己做测试也验证了这个猜测,比如像CookContainer中Add两个JSESSIONID,但是Value不同,但就只有最后Add的生效,这个是不是类的实现问题?在Java中就允许两个JSESSIONID但不同值的cookie存在,这个在.net中如何实现呢?
      

  3.   

    比如你新建一个cookie.
    HttpCookie cookie = new HttpCookie["JSESSIONID"];
    cookie.Value = "JSESSIONID";
    Response.AppendCookie(cookie);从这个新建cookie的代码上就可以看出 如果已经存在一个叫JSESSIONID,它会覆盖掉的。
      

  4.   

    如果需要在一个cookie中保存多个值,你可以这样写
    HttpCookie cookie = new HttpCookie("JSESSIONID");
    cookie.Values.Add("UserName","nevermore_0923");
    cookie.Values.Add("Userpwd","*****");
    cookie.Values.Add("sex","NOwoman");
    Response.AppendCookie(cookie);
      

  5.   

    取值的时候
    HttpCookie cookie = Request.Cookies["JSESSIONID"];
    value1 = cookies.Values["UserName"];
    value2 = cookies.Values["Userpwd"];
      

  6.   

    对,但是现在想解决这个问题有什么办法吗?因为实际HTTP交互过程中存在两个JSESSIONID的情况很多啊,难道必须改用Java了么。。
      

  7.   

    回nevermore_0923这位朋友,因为HTTP请求不是我发的,是从浏览器发送的,我只是做一下监听,有点类似HTTP Proxy的功能,但是监听到的cookie中是包含有两个JSESSIONID的,但我只能取出一个。。这样就会影响后面的处理
      

  8.   

    实在想不通为什么要有两个同名的cookie,多值cookie为什么不用?如果只是为了记录一个状态在不同时刻的值,
    那直接用 “,”或者什么的隔开,
    到程序里在进行处理,不是更好吗?如果你现在的需求,用这种方式满足不了。
    那请你详细描述的你的需求,大家一起在想解决方法
      

  9.   


    大概说一下为什么会产生两个JSESSIONID,这是通过抓包分析登录一个网站的过程看到的,在浏览器中输入地址并按回车,会打开一个网站的登录页面,在这个过程中WEBSERVER会产生一个JSESSIONID,用于标识浏览器的身份,当输入用户名、密码后点击登录按钮,WEBSERVER会临时生成一个JSESSIONID用于记录用户名、口令信息,到下次GET请求时浏览器就会带着最开始的JSESSIONID和这个临时生成的JSESSIONID一起发送到WEBSERVER,这时就会有两个JSESSIONID了我的需求就是先实现一个HTTP Proxy,然后需要在请求包中加入HTTPS的安全因素,比如X509证书,首先监听浏览器段发来的HTTP Request,进行HTTPS安全认证加工,然后将其转发到Webserver,等待Webserver的Response,然后转发回浏览器,如果只是单纯的Proxy可以采用Socket方式转发这种比较简单,但是需要加入HTTPS的相关信息用Socket就比较难实现了
      

  10.   

    你查一下 HTTP 规范,看看有没有说明一个规范的处理程序应该如何解释cookie重名问题。如果RFC规范没有规定,那么各种工具完全有可能有自己的处理规则。
      

  11.   

    在第一样看到你的帖子问题是,我心里的第一反应是:规范的工具应该仅仅返回第二个cookie值出来,这才是比较规范的处理。如果你需要自己手动解释cookie,那么可能其实应该直接使用tcplistener。或者你了反过来看看,所谓提交两个重名的cookie,还“正常”地用在业务处理上,这种要求在各种浏览器、前端程序、web service提供程序、甚至防火墙上是否是一种规范的做法?
      

  12.   

    直接从 Response.Headers["Cookie"] 取字符串
      

  13.   

    我用的浏览器是IE 6.0,我认为这种重名cookie的出现概率还是很高的,至少我抓包看的情况是这样的。
    HTTP规范中我没有看到cookie重名的相关解释,我比较纳闷的是Java封装的类就能完整的读出来这些重名cookie,但是C#得类就不行,
    当初用C#就是因为它读取X509比较方便,看来现在不得不用Java开发了