2009-07-31 22 views
24

Tôi muốn đường hầm thông qua một yêu cầu HTTP từ máy chủ của tôi đến một máy chủ từ xa, đi qua tất cả các cookie. Vì vậy, tôi tạo một đối tượng HttpWebRequest mới và muốn đặt cookie trên đó.Gửi cookie bằng HttpCookieCollection và CookieContainer

HttpWebRequest.CookieContainer là loại System.Net.CookieContainer giữ System.Net.Cookies.

Mở đối tượng yêu cầu đến của tôi:

HttpRequest.Cookies là gõ System.Web.HttpCookieCollection nắm giữ System.Web.HttpCookies.

Về cơ bản tôi muốn có thể gán chúng cho nhau, nhưng các loại khác nhau làm cho nó không thể. Tôi có phải chuyển đổi chúng bằng cách sao chép các giá trị của chúng hoặc có cách nào tốt hơn không?

Trả lời

34

Dưới đây là đoạn code tôi đã sử dụng để chuyển các đối tượng cookie từ các yêu cầu gửi đến mới HttpWebRequest ... ("myRequest" là tên của HttpWebRequest đối tượng của tôi.)

HttpCookieCollection oCookies = Request.Cookies; 
for (int j = 0; j < oCookies.Count; j++) 
{ 
    HttpCookie oCookie = oCookies.Get(j); 
    Cookie oC = new Cookie(); 

    // Convert between the System.Net.Cookie to a System.Web.HttpCookie... 
    oC.Domain = myRequest.RequestUri.Host; 
    oC.Expires = oCookie.Expires; 
    oC.Name  = oCookie.Name; 
    oC.Path  = oCookie.Path; 
    oC.Secure = oCookie.Secure; 
    oC.Value = oCookie.Value; 

    myRequest.CookieContainer.Add(oC); 
} 
+0

Tôi nghĩ kỹ thuật này sẽ hiệu quả, nhưng tôi thực sự hy vọng một giải pháp không liên quan đến việc sao chép từng giá trị. – Mike

+0

whats với thử với các sản phẩm nào? – CRice

+0

điểm tốt, đã bị xóa. – David

1

Các gợi ý từ David là người đúng. Bạn cần phải sao chép. Chỉ đơn giản là tạo ra chức năng để sao chép nhiều lần. Đối tượng HttpCookie và Cookie được tạo ra để đảm bảo chúng ta có thể phân biệt cả về chức năng của nó và vị trí của nó. HttpCookie được sử dụng giữa người dùng và Cookie proxy của bạn được sử dụng giữa proxy và máy chủ web từ xa của bạn.

HttpCookie có ít chức năng hơn vì cookie có nguồn gốc từ bạn và bạn biết cách xử lý nó. Cookie cung cấp cho bạn quản lý cookie nhận được từ máy chủ web. Giống như CookieContainer, nó có thể được sử dụng để quản lý miền, đường dẫn và hết hạn.

Vì vậy, phía người dùng và phía máy chủ web khác nhau và để kết nối nó, chắc chắn bạn cần phải chuyển đổi nó. Trong trường hợp của bạn, nó chỉ đơn giản là chỉ định trực tiếp.

Lưu ý rằng CookieContainer có lỗi trên phương thức .Thêm (Cookie) và .GetCookies (uri).

Xem các chi tiết và sửa chữa ở đây:

http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

CallMeLaNN

3

Tôi đã có một cần phải làm hôm nay cho một trang web SharePoint trong đó sử dụng hình thức Dựa Authentication (FBA). Nếu bạn thử và gọi một trang ứng dụng mà không nhân bản các cookie và gán một đối tượng CookieContainer thì yêu cầu đó sẽ thất bại.

tôi đã chọn để tóm tắt các công việc để phương pháp này mở rộng tiện dụng:

public static CookieContainer GetCookieContainer(this System.Web.HttpRequest SourceHttpRequest, System.Net.HttpWebRequest TargetHttpWebRequest) 
    { 
     System.Web.HttpCookieCollection sourceCookies = SourceHttpRequest.Cookies; 
     if (sourceCookies.Count == 0) 
      return null; 
     else 
     { 
      CookieContainer cookieContainer = new CookieContainer(); 
      for (int i = 0; i < sourceCookies.Count; i++)     
      { 
       System.Web.HttpCookie cSource = sourceCookies[i]; 
       Cookie cookieTarget = new Cookie() { Domain = TargetHttpWebRequest.RequestUri.Host, 
                Name = cSource.Name, 
                Path = cSource.Path, 
                Secure = cSource.Secure, 
                Value = cSource.Value }; 
       cookieContainer.Add(cookieTarget); 
      } 
      return cookieContainer; 
     } 
    } 

Bạn có thể sau đó chỉ cần gọi nó từ bất kỳ HttpRequest đối tượng với một mục tiêu HttpWebRequest đối tượng như một tham số, ví dụ:

HttpWebRequest request;     
request = (HttpWebRequest)WebRequest.Create(TargetUrl); 
request.Method = "GET"; 
request.Credentials = CredentialCache.DefaultCredentials; 
request.CookieContainer = SourceRequest.GetCookieContainer(request);     
request.BeginGetResponse(null, null); 

trong đó TargetUrl là Url của trang tôi đang theo dõi và SourceRequest là HttpRequest của trang tôi đang truy cập, được truy xuất qua Page.Request.

Các vấn đề liên quan