如何从回调函数 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 .任何人都帮助我实现这一目标。

提前致谢

如何从回调函数 WP7 获取响应值

有几种方法可以做到这一点:

第一种方法是使用 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)
        {
        }
    }