如何从回调函数 WP7 获取响应值
本文关键字:获取 响应 WP7 函数 回调 | 更新日期: 2023-09-27 18:32:15
我正在使用Windows Phone 7。如何从以下代码中获取响应值???
private void sampleRequest()
{
try
{
HttpWebRequest httpLoginRequest = (HttpWebRequest)WebRequest.Create(new Uri(DisplayMessage.Authentication_URL ));
httpLoginRequest.Method = DisplayMessage.Get_Method;
Parameters = new Dictionary<string, string>();
httpLoginRequest.BeginGetResponse(new AsyncCallback(GetLoginCallback), httpLoginRequest);
}
catch (Exception ex)
{
throw ex;
}
}
private void GetLoginCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest httpRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse httpresponse = (HttpWebResponse)httpRequest.EndGetResponse(asynchronousResult);
}
catch(WebException ex)
{
}
}
SampleRequest()
被放置在不同的类中,例如classA
.现在我需要 httpresponse 值在 classB
.任何人都帮助我实现这一目标。
提前致谢
有几种方法可以做到这一点:
第一种方法是使用 Microsoft.Bcl.Async nuget 包,此包使您能够在 Windows Phone 7 应用程序中使用 async/await,并且使您能够通过等待 sampleRequest 来"只获取返回值",就像如果它不是异步时
所做的那样: private async Task<WebResponse> sampleRequest()
{
try
{
HttpWebRequest httpLoginRequest = (HttpWebRequest)WebRequest.Create(new Uri(DisplayMessage.Authentication_URL));
httpLoginRequest.Method = DisplayMessage.Get_Method;
Parameters = new Dictionary<string, string>();
WebResponse webResponse =await httpLoginRequest.GetResponseAsync();
}
catch (Exception ex)
{
throw ex;
}
}
可以在 B 类中使用,如下所示:
WebResponse response=await classAInstance.sampleRequest()
-第二种方法是将自己的回调作为 sampleRequest 的参数传递:
public class State
{
public HttpWebRequest WebRequest { get; set; }
public Action<HttpWebResponse > ResponseCallBack;
}
void sampleRequest(Action<HttpWebResponse > responseCallBack)
{
HttpWebRequest httpLoginRequest = (HttpWebRequest)WebRequest.Create(new Uri(DisplayMessage.Authentication_URL));
//httpLoginRequest.Method = DisplayMessage.Get_Method;
//Parameters = new Dictionary<string, string>();
httpLoginRequest.BeginGetResponse(new AsyncCallback(GetLoginCallback),
new State(){WebRequest = httpLoginRequest,
ResponseCallBack = responseCallBack
});
}
private void GetLoginCallback(IAsyncResult asynchronousResult)
{
try
{
State state= (State)asynchronousResult.AsyncState;
HttpWebResponse httpresponse = (HttpWebResponse)state.WebRequest.EndGetResponse(asynchronousResult);
...
//Dispatch request back to ui thread
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
state.ResponseCallBack(httpresponse );
});
}
catch(WebException ex)
{
}
}
您可以在 B 类中使用,如下所示:
classAInstance.sampleRequest((httpResponse)=>{
//Do what you want with http response here
});
-第三种方法是在类A上添加一个事件,您将在tGetLoginCallback中触发该事件,并在类B中注册该事件:
public event EventHandler<Response> LoginComplete;
void sampleRequest(){
//identical original one
....
}
private void GetLoginCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest httpRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse httpresponse = (HttpWebResponse)httpRequest.EndGetResponse(asynchronousResult);
...
//Dispatch request back to ui thread
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
if (LoginComplete != null)
{
LoginComplete(this,response);
}
});
}
catch (WebException ex)
{
}
}