【问题标题】:Multiple consecutive HttpWebRequest on Windows Phone 7Windows Phone 7 上的多个连续 HttpWebRequest
【发布时间】:2012-12-06 12:11:02
【问题描述】:

我正在尝试在 WP7 中创建多个连续的 HttpWebRequest。每个都使用前一个的信息(来自 cookie 的 ID、重定向的 URL 位置、一些 HTML ......),因此我们需要“等待”直到前一个完成才能继续。 在 Android 中,我们创建一个新线程,然后您使用多个同步 HttpPost 或 HttpGet 顺序执行,但由于 Silverlight 的异步特性,这里有所不同。

我现在拥有的是我的帮助类(在 UI 线程上实例化):

        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(theUrl);
        request.Method = "POST";

        try
        {
            IAsyncResult ias = request.BeginGetResponse(new AsyncCallback(getCookiesStatus), request);

        }
        catch (Exception e)
        {
            Console.Write("ERROR" + e.Message);
        }

getCookieStatus:

    private void getCookiesStatus(IAsyncResult result)
    {
        HttpWebRequest request = (HttpWebRequest)result.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
        ccCookies = response.Cookies;
        HttpStatusCode sc = response.StatusCode;

        if (sc == HttpStatusCode.Found)
        {
            location = response.Headers["Location"];

        }
    }

在不将函数调用链接到函数的情况下,使用“位置”字符串进行另一个连续的 http 请求的最佳方法是什么?有什么方法可以在 IAsyncResult 之后在 UI 线程中引发“唤醒”(事件?)?

【问题讨论】:

  • 我很好奇,你有理由相信 HTTP 堆栈不会自动跟随 302 响应吗?顺便说一句,有关排序 HttpWebRequest 的一般解决方案,请参阅:geekswithblogs.net/codingbloke/archive/2011/09/10/…
  • 这只是一个简化的例子。在该位置的 URL 中,我获得了 GET 中传递给下一页的 SessionID 的值,该页面有一个用于登录的 FORM,我直接创建而无需通过 302。

标签: silverlight windows-phone-7 httpwebrequest


【解决方案1】:

async ctp 是一个新的 Visual Studio 功能,它为这种类型的异步顺序工作流提供了一些很好的语法糖。不幸的是,它还不适合生产代码,因为它仍然是一个技术预览。

在此之前,您必须链接回调(对于 2 或 3 个操作来说并不可怕,但除此之外:意大利面条)或使用类似 coroutine pattern 的东西,通过迭代器和生成器实现。

编辑:@AnthonyWJones 使用上述 cmets 中的生成器链接到另一个协程实现。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多