Windows phone 7 自定义类中的HttpWebRequest
我正在尝试为WindowsPhone7Mango制作一个应用程序,用来解析网站的内容。我设法写了所有的代码,但它就像一个战区;)。当我试图以更好的方式重新排列代码时,我开始面临一个非常奇怪的问题 问题是,我在项目中创建了一个名为“MedinetMySchedule”的自定义类,并使用断点逐步遍历该类。我发现该应用程序通过第一个方法getrequest()执行步骤,然后返回主页进行几个步骤,然后返回第二个方法GetRequestStreamCallback()。这个跳转到主页的操作留给我一个值为null的字符串来解析。然后跳回第三个方法ReadWebRequestCallback()。最后一次跳转没有给我什么重要的东西,因为调试结束了,我在手机模拟器上什么也没有得到。MedinetMySchedule类具有以下代码:-Windows phone 7 自定义类中的HttpWebRequest,windows-phone-7,c#-4.0,httpwebrequest,Windows Phone 7,C# 4.0,Httpwebrequest,我正在尝试为WindowsPhone7Mango制作一个应用程序,用来解析网站的内容。我设法写了所有的代码,但它就像一个战区;)。当我试图以更好的方式重新排列代码时,我开始面临一个非常奇怪的问题 问题是,我在项目中创建了一个名为“MedinetMySchedule”的自定义类,并使用断点逐步遍历该类。我发现该应用程序通过第一个方法getrequest()执行步骤,然后返回主页进行几个步骤,然后返回第二个方法GetRequestStreamCallback()。这个跳转到主页的操作留给我一个值为n
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 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;
}
MedinetMySchedule=new MedinetMySchedule();
mittschema.url=”https://medinet.se/cgi-bin/doctor.pl?action=login&customer=saskir&language=se";
getschema.getrequest();
Dispatcher.BeginInvoke(()=>parseResults(mittschema.myresponse));
私有void解析结果(字符串myresponse)
{
if(string.IsNullOrEmpty(myresponse))
{
返回;
}
//启动列表框并向其中添加项
List medinetScheme=new List();
//使用HtmlAgilityPack从响应中解析HTMLcode
HtmlDocument htdoc=新的HtmlDocument();
htdoc.LoadHtml(myresponse);
foreach(htdoc.DocumentNode.SelectNodes中的HtmlNode表(“//table[@class='list-medium']]/tbody[1]/tr[@class]”)
{
//删除子节点
表.ChildNodes.RemoveAt(3);
字符串itemValue=table.InnerText;
//将解析的日期更改为日期时间
字符串d;
DateTime datum=DateTime.Parse(itemValue.Remove(11));
d=基准ToString(“d”);
//向列表框添加项目
添加(新的medinetScheme(){Datum=d,Sections=itemValue.Remove(0,15)});
}
MediNetScheme.ItemsSource=MediNetScheme;
}
你知道为什么会发生这种情况以及如何纠正吗
你的
/Omar执行来回是因为request.BeginGetRequestStream是异步的。基本上,它创建一个新线程,并与主代码并行执行。因此,在下载完数据之前,您将调用parseResult。重写代码的方法有很多,我最喜欢的是使用回调:
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();
}
Action callback = () => Dispatcher.BeginInvoke(() => parseResults(mittschema.myresponse));
mittschema.getrequest(callback);
首先,将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();
}
Action callback = () => Dispatcher.BeginInvoke(() => parseResults(mittschema.myresponse));
mittschema.getrequest(callback);
最后,从mainpage调用getrequest方法并告诉它使用parseResults作为回调:
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();
}
Action callback = () => Dispatcher.BeginInvoke(() => parseResults(mittschema.myresponse));
mittschema.getrequest(callback);
哦,我的上帝!你只是救了我的一天,或者我应该说是我的夜晚;)。非常感谢您的努力和时间。这就像魅力和莱森所学到的一样。