2011-10-21 7 views
2

私はWP7で複数の連続したHttpWebRequestを作成しようとしています。それぞれは情報(クッキーからのID、リダイレクトのためのURLロケーション、いくつかのHTML ...)を前のものから使用するので、前のものが終了するまで「待つ」必要があります。 Androidでは新しいスレッドを作成し、複数の同期HttpPostまたはHttpGetを使用して順次実行しますが、ここではSilverlightの非同期性のために異なります。Windows Phone 7で複数の連続したHttpWebRequest

私が今持っていることは、これは(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スレッドで「waker」(イベント?)を呼び出す方法はありますか?

+0

私は興味がありますが、HTTPスタックが302レスポンスに自動的に従うだけではないと信じる理由がありますか? HttpWebRequestのシーケンシングの一般的な解決方法についてはこちらをご覧ください:http://geekswithblogs.net/codingbloke/archive/2011/09/10/the-asyncoperationservice-and-httpwebrequest.aspx – AnthonyWJones

+0

これは単なる単純な例です。その場所のURLには、GETで渡されたSessionIDの値が次のページに渡されます。このページには、302を経由せずに直接ログインするためのFORMがあります。 – Alejandro

答えて

1

async ctpは、このタイプの非同期シーケンシャルワークフローに非常に優れた構文上の砂糖を提供する新しいビジュアルスタジオ機能です。残念なことに、それはまだ技術プレビューであるため、生産コードには適していません。

これまでは、コールバックをチェーン化する必要がありました(2または3回の操作ではひどい問題ではありませんが、スパゲッティ以降)。イテレータとジェネレータでcoroutine patternを実装してください。

編集:@AnthonyWJonesは、上記のコメントのジェネレータを使用して別のコルーチンの実装にリンクされています。

+1

async ctpの問題は、Silverlight WP7では一部のXNA DLL ==マーケット検証失敗:http://social.msdn.microsoft.com/Forums/es-ES/async/thread/57374305-f739-48f3-9a53-6267c716814b – Alejandro

関連する問題