2017-03-10 9 views
0

이것은 내 코드입니다. 한 번에 여러 쿠키를 가져 오거나 설정하거나 제거합니다. 설정 및 제거 (모두) 잘 작동하지만 만료 된 쿠키를 CookieCollection에서 삭제할 수는 없습니다. getCookiesButton_Click 방법에서 CookieCollection에서 쿠키를 제거하는 방법은 무엇입니까?

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using System.Web; 
using Newtonsoft.Json; 

namespace SetGetMultipleCookies 
{ 
    public partial class GetSetCookiesForm : Form 
    { 
     string readCookiesUrl = "http://test.dev/_test/cookies/readcookie.php"; 
     string setCookiesUrl = "http://test.dev/_test/cookies/setcookie.php"; 
     CookieContainer cookieHeader = new CookieContainer(); 
     CookieCollection cookie_collection = new CookieCollection(); 

     public GetSetCookiesForm() 
     { 
      InitializeComponent(); 
     } 

     private void getCookiesButton_Click(object sender, EventArgs e) 
     { 
      // begins variable for page content. 
      string pageSource; 
      // send url request to web page. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.readCookiesUrl); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       if (!each_cookie.Expired) 
       { 
        request.Headers.Add("Cookie", each_cookie.ToString()); 
       } else 
       { 
        // how to remove an expired cookie from cookie collection? 

       } 
      } 

      // read the page content 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       pageSource = sr.ReadToEnd(); 
      } 

      // display debug. 
      resultBox.Text = pageSource + "\r\n"; 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       resultBox.Text += each_cookie.ToString() + "; expires=" + each_cookie.Expires + "; path=" + each_cookie.Path + ";domain=" + each_cookie.Domain + "\r\n"; 
       if (each_cookie.Expired) 
       { 
        resultBox.Text += "cookie expired.\r\n"; 
       } 
      } 
     } 

     private void setCookiesButton_Click(object sender, EventArgs e) 
     { 
      // send url request to set cookie. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.setCookiesUrl); 
      request.Method = "GET"; 
      request.CookieContainer = this.cookieHeader; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // set cookies 
      this.cookie_collection = response.Cookies; 
      // debug 
      resultBox.Text = "Headers ==========\r\n"; 
      foreach (string each_header in response.Headers) 
      { 
       resultBox.Text += each_header + " = " + response.Headers[each_header] + "\r\n"; 
      } 
      resultBox.Text += "\r\nCookies (" + response.Cookies.Count + ") ==========\r\n"; 
      foreach (Cookie each_cookie in response.Cookies) 
      { 
       resultBox.Text += each_cookie.ToString() + "\r\n"; 
       resultBox.Text += each_cookie.Name + "\r\n"; 
       resultBox.Text += each_cookie.Value + "\r\n"; 
       resultBox.Text += each_cookie.Expires + "\r\n"; 
       resultBox.Text += each_cookie.Path + "\r\n"; 
       resultBox.Text += each_cookie.Domain + "\r\n"; 
       resultBox.Text += each_cookie.Secure + "\r\n"; 
       resultBox.Text += each_cookie.HttpOnly + "\r\n"; 
       resultBox.Text += each_cookie.Expired + "\r\n"; 
       resultBox.Text += "\r\n"; 
      } 
      // get response body. 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String responseText = reader.ReadToEnd(); 
       // json decode 
       //LoginResponse responsej = JsonConvert.DeserializeObject<LoginResponse>(responseText); 
       // display debug. 
       resultBox.Text += "Response body ==========\r\n"; 
       resultBox.Text += responseText + "\r\n"; 
      } 
     } 

     private void removeCookiesButton_Click(object sender, EventArgs e) 
     { 
      this.cookieHeader = new CookieContainer(); 
      this.cookie_collection = new CookieCollection(); 

      resultBox.Text = "Logged out."; 
     } 
    } 
} 

, 방금 CookieCollection에서 만료 된 쿠키를 제거 할. 그렇게하는 방법? 만료 된 쿠키를 제거하는 방법 CookieCollection? 빨간색 사각형 라인에서

enter image description here

, 즉 에 클릭은 그것이이 CookieCollection에서 완전히 제거해야 올바른하지만 두 번째입니다 만료 된 보고서가 보여주는 쿠키를 받기 만료 된 쿠키 처음이다 .

+0

어쨌든 무엇을하려하십니까? 왜 모두 수동으로합니까? 대개 그런 방식은 아닙니다.이 수업은 배후에서 함께 작동하도록 설계되었습니다. 이 CookieContainer 클래스는 종종 필요한 모든 것입니다.이 클래스는 쿠키 캐싱을 처리하고 만료 된 쿠키를 제거하고 다양한 쿠키를 코어 탭 URL로 올바르게 처리합니다. "쿠키 처리"는 CookieContainer 및 WebClient 인스턴스를 만들고 쿠키 컨테이너를 사용하도록 설정 한 다음 웹 클라이언트를 사용하여 요청을 생성하는 것입니다. 리디렉션을 따라 가며 지루한 것들을 모두 처리해줍니다. – quetzalcoatl

+1

~> http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class etc? – quetzalcoatl

+0

@quetzalcoatl Rest API를 사용하여 웹 서버와 연결되어있는 클라이언트 프로그램을 만들고 싶습니다. 로그인과 같은 많은 쿠키, 일부 설정 값을 사용합니다. VC# 및 C# 언어에 익숙하지 않아서 익숙하지 않아 쿠키를 처리하는 가장 좋은 방법이 무엇인지 알지 못합니다. 이것에 대한 예제와 튜토리얼은 많지 않습니다. 고맙습니다. 나는 그것을 곧 시도 할 것이다. – vee

답변

0

아래의 고정 찾을 좋아하는 것을 할 수있는 별도의 방법을 쓸 수있는 하나의

HttpContext.Current.Session.Abandon(); 
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 

아래에 시도 할 수 있습니다.

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using Newtonsoft.Json; 

namespace SetGetMultipleCookies 
{ 
    public partial class GetSetCookiesForm : Form 
    { 
     string readCookiesUrl = "http://test.dev/_test/cookies/readcookie.php"; 
     string setCookiesUrl = "http://test.dev/_test/cookies/setcookie.php"; 
     CookieContainer cookie_container = new CookieContainer(); 
     CookieCollection cookie_collection = new CookieCollection(); 


     public GetSetCookiesForm() 
     { 
      InitializeComponent(); 
     } 


     private void getCookiesButton_Click(object sender, EventArgs e) 
     { 
      // begins variable for page content. 
      string pageSource; 
      // send url request to web page. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.readCookiesUrl); 
      request.CookieContainer = this.cookie_container; 
      request.UserAgent = "My C# App"; 

      // get response. 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // reset cookie collection. 
      this.cookie_collection = new CookieCollection(); 
      // loop through cookie container to set only non-expired to cookie collection. 
      var cookies_container = this.cookie_container.GetCookies(new Uri(this.readCookiesUrl)); 
      foreach (Cookie each_cookie in cookies_container) 
      { 
       if (!each_cookie.Expired) 
       { 
        this.cookie_collection.Add(each_cookie); 
       } 

      } 

      // read the page content 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       pageSource = sr.ReadToEnd(); 
      } 

      // display debug. 
      resultBox.Text = pageSource.Replace("\n", "\r\n") + "\r\n"; 
      resultBox.Text += "\r\nCookies (" + this.cookie_collection.Count + ") ==========\r\n"; 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       resultBox.Text += each_cookie.ToString() + "; expires=" + each_cookie.Expires + "; path=" + each_cookie.Path + ";domain=" + each_cookie.Domain + "\r\n"; 
       if (each_cookie.Expired) 
       { 
        resultBox.Text += "cookie expired.\r\n"; 
       } 
      } 

      // clear memory. 
      pageSource = default(String); 
      request = default(HttpWebRequest); 
      response = default(HttpWebResponse); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 


     private void setCookiesButton_Click(object sender, EventArgs e) 
     { 
      // send url request to set cookie. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.setCookiesUrl); 
      request.Method = "GET"; 
      request.CookieContainer = this.cookie_container; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.UserAgent = "My C# App"; 
      // get response. 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // set cookies collection 
      this.cookie_collection = response.Cookies; 

      // debug 
      resultBox.Text = "Headers ==========\r\n"; 
      foreach (string each_header in response.Headers) 
      { 
       resultBox.Text += each_header + " = " + response.Headers[each_header].Replace("\n", "\r\n").Replace("\r", "\r\n") + "\r\n"; 
      } 
      resultBox.Text += "\r\nCookies (" + this.cookie_collection.Count + ") ==========\r\n"; 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       resultBox.Text += each_cookie.ToString() + "\r\n"; 
       resultBox.Text += each_cookie.Name + "\r\n"; 
       resultBox.Text += each_cookie.Value + "\r\n"; 
       resultBox.Text += each_cookie.Expires + "\r\n"; 
       resultBox.Text += each_cookie.Path + "\r\n"; 
       resultBox.Text += each_cookie.Domain + "\r\n"; 
       resultBox.Text += each_cookie.Secure + "\r\n"; 
       resultBox.Text += each_cookie.HttpOnly + "\r\n"; 
       resultBox.Text += each_cookie.Expired + "\r\n"; 
       resultBox.Text += "\r\n"; 
       // add cookie to cookiecontainer 
       this.cookie_container.Add(each_cookie); 
      } 
      // get response body. 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String responseText = reader.ReadToEnd(); 
       // json decode 
       //LoginResponse responsej = JsonConvert.DeserializeObject<LoginResponse>(responseText);// too lazy to do this. 
       // display debug. 
       resultBox.Text += "Response body ==========\r\n"; 
       resultBox.Text += responseText + "\r\n"; 
       // clear memory. 
       reader = default(StreamReader); 
       responseText = default(String); 
      } 

      // clear memory. 
      request = default(HttpWebRequest); 
      response = default(HttpWebResponse); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 


     private void removeCookiesButton_Click(object sender, EventArgs e) 
     { 
      this.cookie_container = new CookieContainer(); 
      this.cookie_collection = new CookieCollection(); 

      resultBox.Text = "Logged out."; 

      // clear memory. 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 
    } 
} 
0

각 쿠키에 대해 Expiry date을 설정해야만 쿠키를 청소할 수 있습니다. 당신이 그런 아래에 주어진처럼하는 이미 알려진 이름 Cookie, 당신은 Expires 시간을 설정할 수 있습니다 제거하려면

또한, 당신은 Cookies

// clear cookies server side 
HttpContext.Current.Request.Cookies.Clear(); 

을 취소 Clear() 방법을 시도 할 수있을 때 시간에 도달 자동으로 Cookie이 제거됩니다.

if (Request.Cookies["cookiename"] != null) 
{ 
    Response.Cookies["cookiename"].Expires = DateTime.Now.AddDays(-1); 
} 

때때로 SessionCookies가 자동으로 제거되지 않습니다 관련. 이를 위해 당신은 또한

private void ExpireAllCookies() 
{ 
    if (HttpContext.Current != null) 
    { 
     int cookieCount = HttpContext.Current.Request.Cookies.Count; 
     for (var i = 0; i < cookieCount; i++) 
     { 
      var cookie = HttpContext.Current.Request.Cookies[i]; 
      if (cookie != null) 
      { 
       var cookieName = cookie.Name; 
       var expiredCookie = new HttpCookie(cookieName) {Expires = DateTime.Now.AddDays(-1)}; 
       HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it 
      } 
     } 

     // clear cookies server side 
     HttpContext.Current.Request.Cookies.Clear(); 
    } 
} 
+0

아니요, "만료 된 쿠키"(만료 된 각 쿠키)를 의미합니다. getCookiesButton_Click 메서드를 살펴보십시오. removeCookiesButton_Click – vee

+0

.Expires 또는 .Expired가 제거되지 않았습니다. 프로그램에 만료 되었음이 표시됩니다. 쿠키를 다시 클릭하면 컬렉션에서 사라지고 싶습니다. 만료되지 않은 쿠키 만 사용할 수 있습니다. – vee

+0

전체 내용으로 질문을 업데이트했습니다. 그것은 웹 응용 프로그램 (asp.net)이 아닌 창 형태이며.만료되었거나 심지어 HttpContext가 작동하지 않습니다. 배열 키를 삭제하는 것만으로리스트에서 삭제할 필요가 있습니다. 그러나 이것에 익숙하지 않기 때문에 어떻게 해야할지 모르겠습니다. – vee