WP7同步Web请求

Soo*_*nts 5 .net c# windows-phone-7

我正在开发一个Windows Phone 7.1应用程序,并试图实现墓碑.

由于法律原因,我无法保存我的视图模型.我只保存加密的会话ID,可用于从远程服务器加载视图模型数据.

在恢复时,我需要验证会话ID,如果它已过期 - 我将用户带到我的应用程序的登录页面,如果它仍然正常,我从服务器重新加载视图模型数据.

问题是HttpWebRequest缺少阻塞API.此外,在内部页面.OnNavigatedTo方法去墓碑后,这里描述的方法永远阻止.

我通过展示自己的启动画面解决了这个问题.

但是,我宁愿完成那些RPC调用,同时系统提供的"Resuming ..."启动画面是可见的,即在我从page.OnNavigatedTo方法返回之前.

任何想法如何在内页时同步完成HTTP请求.OnNavigatedTo de-tombstoning之后?

Der*_*tie 0

更新:另一种选择是使用Reactive Extensions

如果您使用的是 VS2010,您可以安装 AsyncCTP 并且当您执行此操作时,会添加一个扩展方法来允许您等待响应。

static async Task<Stream> AsynchronousDownload(string url)
  {
    WebRequest request = WebRequest.Create(url);
    WebResponse response = await request.GetResponseAsync();
    return (response.GetResponseStream());
  }
Run Code Online (Sandbox Code Playgroud)

然后:

更新:

protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            var myResponse = await AsynchronousDownload("http://stackoverflow.com");
        }
Run Code Online (Sandbox Code Playgroud)

或者

如果您使用的是 VS2012,您可以安装Microsoft.Bcl.Async库并执行与使用 AsyncCTP 相同的操作(await响应)。

或者

您可以在 Caliburn Micro 中实现类似于协程的东西。为此,您需要实现 IResult 接口。

 public interface IResult
{
    void Execute(ActionExecutionContext context);
    event EventHandler<ResultCompletionEventArgs> Completed;
}
Run Code Online (Sandbox Code Playgroud)

一个可能的实现:

public class HttpWebRequestResult : IResult
    {
        public HttpWebRequest HttpWebRequest { get; set; }
        public string Result { get; set; }

        public HttpWebRequestResult(string url)
        {
            HttpWebRequest = (HttpWebRequest) HttpWebRequest.Create(url);

        }

        public void Execute (ActionExecutionContext context)
        {
            HttpWebRequest.BeginGetResponse (Callback, HttpWebRequest);
        }

        public void Callback (IAsyncResult asyncResult)
        {
            var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
            var httpWebResponse = (HttpWebResponse) httpWebRequest.EndGetResponse(asyncResult);

            using (var reader = new StreamReader(httpWebResponse.GetResponseStream()))
                Result = reader.ReadToEnd();

            Completed (this, new ResultCompletionEventArgs ());
        }

        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
    }
Run Code Online (Sandbox Code Playgroud)

然后调用它:

var httpWebRequestResult = new HttpWebRequestResult("http://www.google.com");
            yield return httpWebRequestResult;
            var result = httpWebRequestResult.Result;
Run Code Online (Sandbox Code Playgroud)

可能是从 CM 获取协程实现并单独使用它的示例。