2013-05-20 6 views
1

내 생각에 잘못하면 나를 수정하십시오.WebClient를 사용하여 쿠키를받을 수 없습니다.

아시다시피 새로운 WebClient 클래스 인스턴스는 새 세션을 시작하여 새 세션 ID를 생성합니다.

이 문제를 방지하려면 첫 번째 사용에서 세션 ID를받은 다음 WebClient의 모든 새 인스턴스에 전달해야합니다. 이

이론적으로 (들어 방법은 다른 모든 매개 변수로 요청에 추가 할 수 있습니다 "GET"), 다음과 같이 클래스를 사용하여 수행 할 수 있습니다

public class ExtendedWebClient : WebClient 
{ 
    public CookieContainer CookieContainer { get; private set; } 

    [SecuritySafeCritical] 
    public ExtendedWebClient() 
    { 
     this.CookieContainer = new CookieContainer(); 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 

     if (request is HttpWebRequest) 
      (request as HttpWebRequest).CookieContainer = this.CookieContainer; 

     return request; 
    } 
} 

그러나 그것이 작동하지 않습니다 jsessionid 쿠키를 사용하는 경우이 방법에는 두 가지 문제점이 있습니다.

  1. 저장된 CookieContainer에서 jsessionid 값을 볼 수 없습니다. 나는 아래처럼 다른 접근 방법을 사용하여이 값을 수신 한 다음 = someValue와, 도움이되지 않습니다 & JSESSIONID로 reqeust의 URI에이 값을 추가 할 것입니다 경우에도
  2. .

Windows Phone에서 이러한 요청을 여러 번 확인했는데 응답이 독특하고 고유 한 jsessionid입니다.

그러나 브라우저에서 이러한 요청을 작성하면 응답은 올바른 jsessionid와 함께 반환됩니다.


다음 코드는 윈도우 폰의 응답 (사용 HttpWebRequest를 대신 웹 클라이언트의)에서 JSESSIONID 값을받을 수 있습니다,하지만 문제가 해결되지 않습니다

     // working with some uri 
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
         request.Method = "GET"; 
         request.CookieContainer = new CookieContainer(); 
         request.BeginGetResponse(asynchronousResult => 
          { 
           try 
           { 
            using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult)) 
            { 
             CookieCollection cookies = response.Cookies; 
             foreach (Cookie c in cookies) 
             { 
              if (c.Name == "JSESSIONID") 
               // jsessionid value is here. Can be saved & stored somewhere 
             } 
             response.Close(); 
            } 


           catch (Exception e) 
           { 
            // handling exception somehow 
           } 
          } 
         , request); 
+0

POST를 사용할 때 실제로 컨테이너를로드하는 것을 보았습니까? 아니면이 가정입니까? –

+0

업데이트 된 질문입니다. 문제는 분명히 GET 방법이 아닙니다. jsessionid 값을받는 방법을 찾았지만 응용 프로그램을 단일 세션에서 강제로 실행할 수 없습니다. 이견있는 사람? – Olter

답변

1

오른쪽, 그래서 JSESSIONID 값의 경우 질문에서 제공된 방법을 사용하여 수신 할 수 있습니다. 솔루션은 ExtendedWebClient가 jsession 값을 무시하므로 HttpWebRequest를 사용하게됩니다. 또한 윈도우 폰에서 작동하지 않습니다

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      request.Method = "GET"; 
      request.CookieContainer = new CookieContainer(); 
      request.CookieContainer.Add(new Uri(url, UriKind.Absolute), StoredCookieCollection._CookieCollection); 
      request.BeginGetResponse(new AsyncCallback(GetSomething), request); 

      private void GetSomething(IAsyncResult asynchronousResult) 
      { 
       // do something 
      } 

      // where in url a jsession value is added to the request as &jsessionid=value 

다른 것은, 당신이 그렇게 쉽게 CookieCollection 유형 값을 직렬화 할 수없는 것이다. 그래서 대신 StringStatus JSESSIONID 값을 IsolatedStorage 설정에 저장하고 Stored 클래스 StoredCookieCollection을 만들어 앱 작업 ​​중에 CookieCollection을 저장합니다. 당신이 JSESSIONID 값을받을 때

그래서, 문자열로 설정 저장 및 CookieCollection으로 정적 클래스에 저장됩니다

using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult)) 
            { 
             CookieCollection cookies = response.Cookies; 
             StoredCookieCollection._CookieCollection = cookies; 
             ... 
            } 

그 접근 방식은 정말 하나의 세션에서 작동하는 응용 프로그램을 강제 할 것이다.

아마도 CookieCollection serialization을 사용하는 좀 더 우아한 해결책이있을 수 있습니다. 그러나 나는 그것을 찾을 수 없었습니다.

관련 문제