Jalankan beberapa permintaan web di WP7?

Saya memiliki daftar alamat yang ingin saya kunjungi menggunakan httpWebRequest. Yang saya perlukan hanyalah kode status yang dikembalikan oleh server.

Saya telah mencoba menelusurinya terlebih dahulu dan memulai httpWebRequest pada masing-masingnya, tetapi kemudian saya hanya menerima panggilan balik dari yang terakhir. Sepertinya hanya satu permintaan web yang diperbolehkan dalam satu waktu.

Saya kesulitan memahami cara melakukan ini tanpa GetResponse, yang tidak diperbolehkan di Silverlight.

Kode ini berjalan di pekerja latar belakang. Dan saya menggunakan Mango - WP7.1

Bagaimana cara mengatasinya?

foreach (var current in Addresses)
        {
            var request = HttpWebRequest.Create(current);
            request.BeginGetResponse(r =>
            {
                try
                {
                    var response = (HttpWebResponse)request.EndGetResponse(r);
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        //BOOM RECEIVED
                    });
                }
                catch (Exception)
                {
                    Debug.WriteLine("Error in EndGetResponse");
                }
            }, null);
        }

Terima kasih sebelumnya =)


person Moulde    schedule 15.07.2011    source sumber
comment
Ya, saya menggunakan mangga =)   -  person Moulde    schedule 15.07.2011
comment
BOOM macam apa yang Anda terima?   -  person CodeZombie    schedule 15.07.2011
comment
Saya menerima kode status dan kemudian saya memperbarui modelnya. BOOM tersebut hanya untuk menggambarkan bahwa ada sesuatu yang diterima =)   -  person Moulde    schedule 15.07.2011
comment
Saya ingin tahu apakah Anda dapat mengulangi seperti itu dalam corouting mikro Caliburn di mana setiap permintaan akan menghasilkan pengembalian, proses pengembalian, terus berjalan.   -  person Derek Beattie    schedule 16.07.2011


Jawaban (1)


Masalah respons tunggal Anda kemungkinan besar disebabkan oleh penggunaan metode anonim dan cara kerja pelingkupan saat Anda memasukkannya ke dalam loop. Anda membuang referensi permintaan sebelumnya pada setiap langkah melalui loop.

Lihat postingan blog saya tentang topik ini di sini http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html

Cara paling sederhana untuk mengilustrasikan hal ini adalah dengan menulis ulang kode Anda dengan metode lengkap, ini memaksa Anda untuk mempertimbangkan cakupannya alih-alih hanya merujuk variabel eksternal secara membabi buta pada delegasi Anda.

foreach (var current in Addresses)
{
  var request = HttpWebRequest.Create(current);
  request.BeginGetResponse(EndGetResponse, new RequestState { Request = request, Address = current });
}


private void EndGetResponse(IAsyncResult result) {
  try {
    var state = (RequestState)result.AsyncState;
    var response = (HttpWebResponse)state.Request.EndGetResponse(result);
    Deployment.Current.Dispatcher.BeginInvoke(GotResponse, state.Address, response.StatusCode);
  } catch (Exception) {
    Debug.WriteLine("Error in EndGetResponse");
  }
}

private void GotResponse(Address address, HttpStatusCode code) {
  //BOOM RECEIVED
}

public class RequestState {
  HttpWebRequest Request { get; set; }
  Address Address { get; set; }
}

Setelah Anda memecahkan masalah pelingkupan, Anda dapat menulis ulang kembali ke metode anonim untuk alasan gaya jika Anda mau.

Ini hanya akan menyelesaikan masalah pertama Anda dalam mendapatkan semua respons kembali, namun saya berasumsi Anda juga perlu menjalankan beberapa kode ketika semua permintaan sudah selesai untuk memeriksa status seluruh batch?
Itu adalah masalah yang sama sekali berbeda.

Anda tidak dapat menggunakan WaitOne() atau semacamnya, ini akan mengunci thread Anda dan menghentikan permintaan agar tidak berjalan sama sekali. Anda mungkin ingin membatalkan metode lain dalam kode BOOM Anda yang menyimpan hasilnya dan memeriksa apakah semua hasilnya sudah masuk.

person Chris Sainty    schedule 15.07.2011
comment
Saya mengerti bagaimana menggunakan metode lengkap dan bukan metode anonim akan menyelesaikan masalah. Tetapi bagaimana saya bisa menulis ulang ke metode anonim setelahnya, jika masalahnya sendiri adalah penggunaan metode anonim? Saya penasaran karena melakukannya dengan cara anonim membuatnya lebih mudah untuk mereferensikan objek dalam loop. Dalam proyek saya, alamatnya terletak pada suatu objek, dan koleksi yang saya iterasi sebenarnya adalah daftar objek-objek tersebut. Dan ketika respons permintaan diterima, saya memerlukan objek yang memulai permintaan untuk menyimpan beberapa nilai yang dikembalikan. - person Moulde; 15.07.2011
comment
@Moulde Itu masalahnya, Anda tidak bisa hanya mereferensikan objek di luar metode anonim, postingan blog saya menjelaskan apa yang terjadi jika Anda melakukannya. Saya telah memperbarui jawaban untuk menunjukkan bagaimana Anda dapat meneruskan lebih dari satu negara bagian ke dalam respons. - person Chris Sainty; 16.07.2011