首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WP7同步web请求

WP7同步web请求
EN

Stack Overflow用户
提问于 2012-11-08 14:21:07
回答 2查看 1.7K关注 0票数 5

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

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

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

问题是HttpWebRequest缺少阻塞应用程序接口。此外,在去逻辑删除后的page.OnNavigatedTo方法内部,方法described here永远阻塞。

我已经通过展示我自己的闪屏解决了这个问题。

然而,我更愿意在系统提供的“恢复…”的同时完成这些RPC调用。启动画面是可见的,即在我从page.OnNavigatedTo方法返回之前。

你有什么想法吗?在去逻辑删除之后,如何在page.OnNavigatedTo内部同步完成HTTP请求?

EN

回答 2

Stack Overflow用户

发布于 2012-11-08 14:36:27

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

如果你使用的是VS2010,你可以安装AsyncCTP,当你这样做的时候,会添加一个允许你等待响应的扩展方法。

代码语言:javascript
复制
static async Task<Stream> AsynchronousDownload(string url)
  {
    WebRequest request = WebRequest.Create(url);
    WebResponse response = await request.GetResponseAsync();
    return (response.GetResponseStream());
  }

然后:

更新:

代码语言:javascript
复制
protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            var myResponse = await AsynchronousDownload("http://stackoverflow.com");
        }

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

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

代码语言:javascript
复制
 public interface IResult
{
    void Execute(ActionExecutionContext context);
    event EventHandler<ResultCompletionEventArgs> Completed;
}

一种可能的实现:

代码语言:javascript
复制
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 { };
    }

那就叫它:

代码语言:javascript
复制
var httpWebRequestResult = new HttpWebRequestResult("http://www.google.com");
            yield return httpWebRequestResult;
            var result = httpWebRequestResult.Result;

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

票数 0
EN

Stack Overflow用户

发布于 2012-11-08 14:56:16

首先我要说的是,微软真的试图推动您进行异步调用,这是有充分理由的,这就是为什么我想强调这一点。

现在,如果你真的想要同步,我有一个想法,我还没有能够测试自己。在使用HttpWebRequest类时,有两个您可能也使用过的重要函数:BeginGetResponseEndGetResponse

这两个功能紧密结合在一起。BeginGetResponse启动一个异步webrequest,当请求完成时,EndGetResponse会在请求完成时提供输出。这就是微软试图让你这样做的方式。同步执行此操作的诀窍是beginGetResponse返回一个IAsyncResult。此IAsyncResult接口包含一个WaitHandler,可用于同步等待,直到请求完成。在此之后,您可以继续使用endGetRequest,继续您的业务。BeginGetRequestStreamEndGetRequestStream也是如此。

但正如我之前所说的,我没有测试过这个解决方案,它纯粹是理论上的。让我知道它是否有效。

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13283607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档