2012-05-12 9 views
1

私は、Windows Phone 7のマンゴー用のアプリケーションを作成してウェブサイトのコンテンツを解析しようとしています。私はすべてのコードを書くことができましたが、それは戦争ゾーンのようでした;)。より良い方法でコードを再配置しようとすると、私は非常に奇妙な問題に直面します。カスタムクラス内のHttpWebRequest

問題は、自分のプロジェクト内で "MedinetMySchedule"というカスタムクラスを作成し、ブレークポイントを使用してこのクラスをステップ実行するときです。私は、アプリケーションが最初のメソッドgetrequest()を通過した後、いくつかのステップでメインページに戻り、2番目のメソッドGetRequestStreamCallback()に戻ります。このメインページへのジャンプは、解析するためにnullの値を持つ文字列で私を残します。次に、3番目のメソッドReadWebRequestCallback()に戻ります。この最後のジャンプは、デバッグが終了し、私は電話エミュレータで何も得られないので何も重要ではありません。ここで

namespace WindowsPhonePanoramaApplication1 
{ 
    public class MedinetMySchedule 
    { 

     //Medinet user url 
     public string url { get; set; } 
     public String myresponse; 
     public void getrequest() 
     { 
      HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.BeginGetRequestStream(GetRequestStreamCallback, request); 
     } 

     private void GetRequestStreamCallback(IAsyncResult asynchronousResult) 
     { 
      HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
      using (Stream postStream = request.EndGetRequestStream(asynchronousResult)) 
      { 
       string postData = string.Format("username={0}&password={1}&customer=******&doLogin=Logga+in&language=se", "*****", "******"); 

       // Convert the string into a byte array. 
       byte[] data = Encoding.UTF8.GetBytes(postData); 


       // Write to the request stream. 
       postStream.Write(data, 0, data.Length); 
       postStream.Close(); 
      } 

      //Initiating get response 
      request.BeginGetResponse(ReadWebRequestCallBack, request); 

     } 

     private void ReadWebRequestCallBack(IAsyncResult asynchronousResult) 
     { 
      HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
      WebResponse myResponse = (WebResponse)request.EndGetResponse(asynchronousResult); 
       Stream encodingStream = myResponse.GetResponseStream(); 
       Encoding encode = Encoding.GetEncoding("iso-8859-1"); 
       using (StreamReader httpwebStreamReader = new StreamReader(encodingStream, encode)) 
       { 
        myresponse= httpwebStreamReader.ReadToEnd(); 
       } 
       myResponse.Close(); 
     } 
    } 
} 

(のGetRequestを呼び出すコードである)と、コンテンツを解析します - - は:MedinetMyScheduleクラスには、次のコードを持っている

  MedinetMySchedule mittschema = new MedinetMySchedule(); 
     mittschema.url = "https://medinet.se/cgi-bin/doctor.pl?action=login&customer=saskir&language=se"; 
     mittschema.getrequest(); 
     Dispatcher.BeginInvoke(() => parseResults(mittschema.myresponse)); 
     private void parseResults(string myresponse) 
    { 
     if (string.IsNullOrEmpty(myresponse)) 
     { 
      return; 
     } 

     //Initiating a listbox and add item to it 
     List<MediNetScheme> medinetScheme = new List<MediNetScheme>(); 
     //Using HtmlAgilityPack to parse the HTMLcode from the response 
     HtmlDocument htdoc = new HtmlDocument(); 
     htdoc.LoadHtml(myresponse); 
     foreach (HtmlNode table in htdoc.DocumentNode.SelectNodes("//table[@class='list-medium']/tbody[1]/tr[@class]")) 
     { 
      //Removing ChildNode 
      table.ChildNodes.RemoveAt(3); 
      string itemValue = table.InnerText; 
      //Changing the parsed date into a DateTime 
      string d; 
      DateTime datum = DateTime.Parse(itemValue.Remove(11)); 
      d = datum.ToString("D"); 
      //Adding items to the listbox 
      medinetScheme.Add(new MediNetScheme() { Datum = d, Sections = itemValue.Remove(0, 15) }); 
     } 
     MediNetScheme.ItemsSource = medinetScheme; 

    } 

任意のアイデアをこれが起こって、どのようにそれを補正することである理由?

ユアーズ /オマー

答えて

2

request.BeginGetRequestStreamが非同期であるためで行き来実行。基本的には、新しいスレッドを作成し、メインコードと並行して実行します。したがって、データのダウンロードが完了する前に、parseResultを呼び出すことになります。あなたのコードを書き換えるには、多くの方法が私のお気に入りは、コールバックを使用している、あります:

まず、コールバックを受け入れ、それを格納するためのGetRequest方法を変更:

private Action Callback; 

    public void getrequest(Action callback) 
    { 
     this.Callback = callback; 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.BeginGetRequestStream(GetRequestStreamCallback, request); 
    } 

その後、ReadWebRequestCallback、呼び出しの終わりにこのコールバック:

private void ReadWebRequestCallBack(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
     WebResponse myResponse = (WebResponse)request.EndGetResponse(asynchronousResult); 
      Stream encodingStream = myResponse.GetResponseStream(); 
      Encoding encode = Encoding.GetEncoding("iso-8859-1"); 
      using (StreamReader httpwebStreamReader = new StreamReader(encodingStream, encode)) 
      { 
       myresponse= httpwebStreamReader.ReadToEnd(); 
      } 
      myResponse.Close(); 

     this.Callback(); 
    } 

最後に、メインページから、のGetRequestメソッドを呼び出し、コールバックとしてparseResultsを使用することを教え:

Action callback =() => Dispatcher.BeginInvoke(() => parseResults(mittschema.myresponse)); 
mittschema.getrequest(callback); 
+0

ああ私の神!あなたは私の一日を救うか、私は夜を言うべきですか?)。あなたの努力と時間をいただきありがとうございます。それは学んだ魅力と功績のように機能します。 – DreamNet

関連する問題