2011-09-29 15 views
5

पर HttpWebRequests के बीच कुकी कोंटेनर साझा करने में समस्याएं मेरे पास एक उत्पादन ऐप है जो HttpWebRequest के माध्यम से दो कॉल करता है। पहला कॉल सत्र सेट करता है और सत्र को बनाए रखने के लिए कुकीज़ वापस प्राप्त करता है, दूसरा कॉल एपीआई से डेटा के लिए होता है। प्रतिक्रिया httponly हैं। मैं दो कॉल के बीच साझा कुकी कंटनर का उपयोग कर रहा हूं, लेकिन दूसरा कॉल हमेशा विफल रहता है। मैंने दूसरी अनुरोध में भेजे जा रहे कुकीज़ को समस्या को कम कर दिया। मैंने यातायात देखने के लिए नेटवर्क मॉनीटर का उपयोग किया है, और यदि मैं स्पष्ट रूप से दूसरे अनुरोध में कुकीज़ सेट करता हूं (नीचे कोड देखें), कॉल सफल होता है। इस मुद्दे पर किसी के पास कोई विचार है? मुझे यह समझने की ज़रूरत है कि साझा कुकी कंटनर के साथ काम करने के लिए इसे कैसे प्राप्त किया जाए।विंडोज फोन 7 (आम)

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

मैं उसकी मुद्दा था और यह एक पुराने कुकी कंटेनर का उपयोग कर के साथ लग रहा था। बस पुराने के माध्यम से Iterating, और नई कुकीज़ बनाने के द्वारा एक नया बनाओ।

चरण 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

मुझे इस कोड की कोशिश करते हैं, मैं एक त्रुटि है कि कहते हैं, "foreach बयान के प्रकार 'System.Net.CookieContainer' चर पर काम नहीं कर सकते क्योंकि 'System.Net.CookieContainer' एक सार्वजनिक परिभाषा शामिल नहीं है मिल 'GetEnumerator' के लिए। क्या आप इसका उपयोग करने में सक्षम थे? धन्यवाद। –

+0

@JeffParies इसके बारे में क्षमा करें, कंप्यूटर से दूर था और कोड में सत्यापित नहीं हो सका। मैंने जवाब अपडेट किया है। –

+0

धन्यवाद, मैं देखूंगा अगर मैं इसे कार्यान्वित कर सकता हूं ... क्या यह httponly कुकीज़ पर काम करता है? –

3

यह समस्या CookieContainer साथ एक ज्ञात समस्या जब डोमेन नाम नहीं है उस पर "www"। कुकी कोंटेनर एक "www" की उम्मीद कर रहा है और डोमेन के लिए मौजूदा कुकीज़ की पहचान नहीं करता है।

आसपास के काम प्रतिक्रिया शीर्षकों से कुकीज़ को पढ़ने और उन्हें किसी भी अन्य अनुरोध में जोड़ने के लिए था।

आम के लिए एक फिक्स के लिए माना जाता था, लेकिन बाहर धकेल दिया गया।

जेफ

+0

चीयर्स। एक ही मुद्दा था, और किसी और से व्यवहार के सत्यापन की तलाश में था। अब मुझे पता है! – theringostarrs

संबंधित मुद्दे