Windows phone 7 在应用程序启动中执行异步方法
我尝试在我的应用程序中实现登录。我需要在页面开始加载之前登录,因为当一切正常时,我会转到第二页,如果不是第一页。为此,我将WMAppManifest设置为:Windows phone 7 在应用程序启动中执行异步方法,windows-phone-7,asynchronous,Windows Phone 7,Asynchronous,我尝试在我的应用程序中实现登录。我需要在页面开始加载之前登录,因为当一切正常时,我会转到第二页,如果不是第一页。为此,我将WMAppManifest设置为: <DefaultTask Name="_default" NavigationPage="" /> 异步方法登录: private async Task<bool> LogIn(string login, string password) { string str_login_number = login;
<DefaultTask Name="_default" NavigationPage="" />
异步方法登录:
private async Task<bool> LogIn(string login, string password)
{
string str_login_number = login;
string str_login_pass = password;
JObject jo = new JObject();
jo.Add("number", str_login_number);
jo.Add("pass", str_login_pass);
JsonWorker jWorker = new JsonWorker();
var response = await jWorker.sendJSON("url", jo);
string str_responseformjson = await jWorker.getJSON(response);
jo = JObject.Parse(str_responseformjson);
if (jo["response"].ToString().Equals("ok"))
{
return true;
}
else
{
return false;
}
}
私有异步任务登录(字符串登录,字符串密码)
{
字符串str_login_number=登录名;
字符串str\u login\u pass=密码;
JObject jo=新的JObject();
添加(“编号”,str\u登录号);
jo.Add(“pass”,str\u login\u pass);
JsonWorker jWorker=新的JsonWorker();
var response=await jWorker.sendJSON(“url”,jo);
字符串str_responseformjson=await jWorker.getJSON(response);
jo=JObject.Parse(str_responseformjson);
if(jo[“response”].ToString().Equals(“ok”))
{
返回true;
}
其他的
{
返回false;
}
}
这是我的类JsonWorker的代码:
class JsonWorker
{
public async Task<HttpWebResponse> sendJSON(string requestUrl, JObject jsonObjesct)
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(requestUrl);
request.ContentType = "text/plain; charset=utf-8";
request.Method = "POST";
byte[] jsonAsBytes = Encoding.UTF8.GetBytes(jsonObjesct.ToString());
Stream x = await request.GetRequestStreamAsync();
await x.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length);
x.Close();
HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync());
return response;
}
public async Task<string> getJSON(
HttpWebResponse response)
{
var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
string str_responsefromjson = await sr.ReadToEndAsync();
sr.Close();
stream.Close();
return str_responsefromjson;
}
}
JsonWorker类
{
公共异步任务sendJSON(字符串requestUrl,JObject jsonObjesct)
{
HttpWebRequest request=(HttpWebRequest)WebRequest.Create(requestUrl);
request.ContentType=“text/plain;charset=utf-8”;
request.Method=“POST”;
byte[]jsonAsBytes=Encoding.UTF8.GetBytes(jsonobjest.ToString());
Stream x=等待请求。GetRequestStreamAsync();
wait x.WriteAsync(jsonAsBytes,0,jsonAsBytes.Length);
x、 Close();
HttpWebResponse=(HttpWebResponse)(wait request.GetResponseAsync());
返回响应;
}
公共异步任务getJSON(
HttpWebResponse(响应)
{
var stream=response.GetResponseStream();
var sr=新的流阅读器(流);
字符串str_responsefromjson=wait sr.ReadToEndAsync();
高级关闭();
stream.Close();
返回str_responsefromjson;
}
}
请提供帮助。我的一个应用程序中有一些工作流。我用一个自定义的方法解决了这个问题。阅读本文了解更多信息 以下是一些基本知识。 UriMapper根据用户是否已输入正确的登录凭据来处理导航到哪个页面。如果之前提供了正确的凭据,应用中的激活和启动事件将始终登录
private void Application_Launching(object sender, LaunchingEventArgs e)
{
RootFrame.UriMapper = new LoginUriMapper();
if (AppSettings.HasLoginInfo)
{
Login();
}
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (e.IsApplicationInstancePreserved == false)
{
// tombstoned! Need to restore state
RootFrame.UriMapper = new LoginUriMapper();
if (AppSettings.NotLoggedIn)
{
Login();
}
}
}
如果登录失败,您的主页将处理逻辑,然后向后导航到登录页面。当您导航到登录页面时,请始终记住从导航堆栈中删除任何条目
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
while(NavigationService.CanGoBack)
{
NavigationService.RemoveBackEntry();
}
}
为什么不将第一页保留为默认页,并仅在记录时转到第二页?@igrali它加载第一页,我实际上看到它几秒钟,它跳到第二页。这看起来不太好。使用一个扩展的启动屏幕页面如何?该页面将有一个附加的带有进度条的“登录”文本,以便用户知道发生了什么。如果登录失败,请转到第1页,否则请转到第2页?我为站点创建了应用程序,所以如果用户在站点上更改密码,将会发生什么情况,我每次都需要真正的登录来检查这一点。但我并没有向用户显示它,所以就像我获取了存储在存储器中的凭据一样,您将需要存储他们的信息。如果他们更改密码,则登录将失败。如果失败,请将其导航到登录页面。当导航到登录页面时,请记住始终清除backbackback,这样用户就不能点击back按钮并转到主页面欢迎!如果答案回答了您的问题,不要忘记将其标记为答案(并向上投票:)
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
while(NavigationService.CanGoBack)
{
NavigationService.RemoveBackEntry();
}
}