Не удается установить CookieContainer из-за состояния ошибки объекта HttpWebRequest? - PullRequest
1 голос
/ 02 ноября 2011

В настоящее время я пытаюсь войти и получить файлы cookie на удаленный сервер с помощью Windows Phone 7 Silverlight в Visual Studio. Мне удалось войти в систему и получить успешный результат для входа, но когда я попытался ввести коды для получения файлов cookie, это просто не удалось.

Произошла ошибка «Невозможно установить CookieContainer из-за состояния объекта HttpWebRequest». в моем коде "request.CookieContainer = new CookieContainer ();"

Может кто-нибудь мне поможет? Кажется, я не могу найти ошибку, и я пытаюсь просмотреть документацию и примеры, но безуспешно. Ниже приведены мои полные коды на Windows Phone 7.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO;
using System.IO.IsolatedStorage;

namespace Testing_Login_
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void buttonLogin_Click(object sender, RoutedEventArgs e)
        {
            //HttpWebRequest req = WebRequest.Create();
            string POST_ADDRESS = "http://mywebsite.com";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(POST_ADDRESS, UriKind.Absolute));  
            request.Method = "POST";  
            // don't miss out this  
            request.ContentType = "application/x-www-form-urlencoded";  
            request.BeginGetRequestStream(new AsyncCallback(RequestReady), request);  


        }
        // Sumbit the Post Data  
        void RequestReady(IAsyncResult asyncResult)
        {
            HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
            Stream stream = request.EndGetRequestStream(asyncResult);

            // Hack for solving multi-threading problem  
            // I think this is a bug  
            this.Dispatcher.BeginInvoke(delegate()
            {
                // Send the post variables  
                StreamWriter writer = new StreamWriter(stream);
                writer.Write("username=" + textBoxUsername.Text + "&password=" + passwordBoxSTAMP.Password);
                writer.Flush();
                writer.Close();

                request.CookieContainer = new CookieContainer();

                request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
            });
        }

        // Get the Result  
        void ResponseReady(IAsyncResult asyncResult)
        {
            HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

            this.Dispatcher.BeginInvoke(delegate()
            {
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                // get the result text  
                string result = reader.ReadToEnd();


                if (result == "TRUE")
                {
                    MessageBox.Show("Login Successful!");

                    //CookieCollection cookieValue = response.Cookies;
                    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        using (IsolatedStorageFileStream isfs = isf.OpenFile("CookieExCookies",  FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            using (StreamWriter sw = new StreamWriter(isfs))
                            {
                                foreach (Cookie cookieValue in response.Cookies)
                                {
                                    sw.WriteLine("Cookie: " + cookieValue.ToString());
                                }
                                sw.Close();
                            }
                        }

                    }
                    //MessageBox.Show(cookieValue.ToString());

                }
                else if (result == "ICRED")
                {
                    MessageBox.Show("Username or Password incorrect!");
                }
                else
                {
                    MessageBox.Show("Unknown Error!"+result);
                }
            });
        }
        private void ReadFromIsolatedStorage()
        {
            using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream isfs =
                   isf.OpenFile("CookieExCookies", FileMode.Open))
                {
                    using (StreamReader sr = new StreamReader(isfs))
                    {
                        textBoxCookies.Text = sr.ReadToEnd();
                        sr.Close();
                    }
                }

            }
        }

    }
}

1 Ответ

0 голосов
/ 02 ноября 2011

Переместить строку: -

request.CookieContainer = new CookieContainer();

из RequestReady и поместите его в buttonLogin_Click сразу после того, как вы его построили.

ИЛИ, так как вы вообще не используете его нигде, ровная линия.

ИЛИ, если на самом деле для того, чтобы вещи действительно работали, вам нужно повторно использовать его, затем сконструировать и удерживать его где-нибудь еще (например, в поле класса) и назначить его каждому объекту запроса, созданному до Вы вызываете любой BeginGetRequestStream или BeginGetResponse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...