2011-09-29 2 views
5

HttpWebRequest를 통해 두 번 전화를 거는 프로덕션 응용 프로그램이 있습니다. 첫 번째 호출은 세션을 설정하고 세션을 유지하기 위해 쿠키를 수신하고, 두 번째 호출은 API의 데이터를위한 것입니다. 응답은 httponly입니다. 두 통화 사이에 공유 CookieContainer를 사용하고 있지만 두 번째 호출은 항상 실패합니다. 나는 두 번째 요청에서 보내지 않은 쿠키로 문제를 좁혔다. 나는 네트워크 모니터를 사용하여 트래픽을 보았고 두 번째 요청에서 쿠키를 명시 적으로 설정하면 (아래 코드 참조) 호출이 성공합니다. 누구든지이 문제에 대한 아이디어가 있습니까? 공유 CookieContainer와 함께 작동시키는 방법을 찾아야합니다.Windows Phone 7 (Mango)에서 HttpWebRequests간에 CookieContainer를 공유하는 데 문제가 있습니다.

private string URL_01 = "https:// [...]"; 
private string URL_02 = "https:// [...]"; 
private CookieContainer _cookieContainer = new CookieContainer(); 
private NetworkCredential nc = new NetworkCredential("username", "password"); 

private void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
HttpWebRequest request = HttpWebRequest.CreateHttp(URL_01); 
request.CookieContainer = _cookieContainer; 
request.Credentials = nc; 
request.UseDefaultCredentials = false; 
request.BeginGetResponse(new AsyncCallback(HandleResponse), request); 
} 

public void HandleResponse(IAsyncResult result) 
{ 
HttpWebRequest request = result.AsyncState as HttpWebRequest; 

if (request != null) 
{ 
    using (WebResponse response = request.EndGetResponse(result)) 
    { 
     using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
     { 
      string data = reader.ReadToEnd(); 

      // gets returned data and deserializes it to an object 
      SessionObject so = JsonConvert.DeserializeObject<SessionObject>(data); 

      if (so.DeviceAPI.Session == "true") 
      { 
       // make a second call for the data 
       HttpWebRequest requestData = HttpWebRequest.CreateHttp(URL_02); 

       // when this is used, the call fails 
       requestData.CookieContainer = _cookieContainer; 

       // when this is used, the call works 
       //requestData.Headers[HttpRequestHeader.Cookie] = "_key=value; _secret=value"; 

       requestData.Credentials = nc; 
       requestData.BeginGetResponse(new AsyncCallback(DataResponse), requestSongData); 
        } 
       } 
      } 
     } 
    } 

    public void DataResponse(IAsyncResult DataResult) 
    { 
     HttpWebRequest requestData = DataResult.AsyncState as HttpWebRequest; 

     if (requestData != null) 
     { 

      using (WebResponse dataResponse = requestData.EndGetResponse(DataResult)) 
      { 
       using (StreamReader reader = new StreamReader(dataResponse.GetResponseStream())) 
       { 
        string data = reader.ReadToEnd(); 
        // do something with the data 
       } 
      } 
     } 
    } 
} 

}

답변

0

나는 그의 문제가 있었다 오래된 쿠키 컨테이너를 사용하여이 될 것 같았다. 이전 쿠키를 반복하고 새로운 쿠키를 생성하여 새 쿠키를 만드십시오.

1 단계. 쿠키를 저장할 사전을 만듭니다. 이 퇴장되기 전에

//create a dictionary to store your persistent cookies 
public static Dictionary<string, Cookie> CookieCollection { get; set; } 

2 단계는 WebRequest 클래스에, 당신은 저장 한 쿠키를 추가합니다. 도메인 이름이 더있을 때

var request = WebRequest.Create(...); 

//add the cookies you have in your persistent cookie jar 

foreach (KeyValuePair<string, Cookie> cookie in _collection) 
      { 
       try 
       { 
        request.CookieContainer.Add(request.RequestUri, new Cookie(cookie.Value.Name, cookie.Value.Value)); 
       } 
       catch 
       { 
       } 
      } 

3 단계 저장에게 쿠키

ResponseCallback (...)는 {

//update your local cookie list as required 
    foreach (Cookie clientcookie in response.Cookies) 
      { 
       if (!_collection.ContainsKey(clientcookie.Name)) 
        _collection.Add(clientcookie.Name, clientcookie); 
       else 
        _collection[clientcookie.Name] = clientcookie; 
      } 
} 
+0

이 코드를하려고 할 때, 나는 'System.Net.CookieContainer가'공공의 정의가 포함되어 있지 않기 때문에 foreach 문은 'System.Net.CookieContainer'유형의 변수에 작동 할 수 없습니다 "라는 오류가 –

+0

@JeffParies 죄송합니다. 컴퓨터에서 떨어져 코드에서 확인할 수 없습니다. 답변을 업데이트했습니다. –

+0

감사합니다. 내가 볼 것입니다. 'GetEnumerator'에 대한 답변입니다. 이 기능을 구현할 수 있다면 ... httponly 쿠키에서 작동합니까? –

3

이 문제는 CookieContainer 알려진 문제입니다 그것에 "www". CookieContainer는 "www"를 기대하며 도메인의 기존 쿠키를 식별하지 않습니다.

해결 방법은 응답 헤더에서 쿠키를 읽고 다른 요청에 추가하는 것입니다.

망고에 대한 수정으로 간주되었지만 푸시 아웃되었습니다.

제프

+0

환호성. 같은 문제가 있었고 다른 사람의 행동에 대한 검증을 찾고있었습니다. 이제 알았어! – theringostarrs