Cara mengirim pra permintaan sebelum setiap permintaan di windows phone 7

Saya ingin mengirim satu permintaan awal ke server saya sebelum mengirim setiap permintaan. Dari pra permintaan itu saya akan menerima token dari server saya dan kemudian saya harus menambahkan token itu ke semua permintaan. Inilah prosesnya.

Saya telah mencoba beberapa metode untuk mencapai ini. Tapi saya menghadapi satu masalah. Artinya, Saat saya mencoba mengirim permintaan awal, permintaan tersebut sedang diproses dengan permintaan saat ini. Itu berarti kedua permintaan berjalan paralel.

Saya ingin mengirim permintaan awal terlebih dahulu dan mengurai tanggapannya. Setelah menguraikan respons pra-permintaan saja saya ingin mengirimkan permintaan lain itu. Tapi permintaan pertama tidak menunggu respon pra permintaan. Tolong beri tahu saya cara apa pun untuk mengirim permintaan awal sebelum semua permintaan.

Ini kode saya:

Model Tampilan:

`public class ListExampleViewModel
    {
        SecurityToken sToken = null;
        public ListExampleViewModel()
        {
            GlobalConstants.isGetToken = true;
            var listResults = REQ_RESP.postAndGetResponse((new ListService().GetList("xx","xxx")));

            listResults.Subscribe(x =>
            {
                Console.WriteLine("\n\n..................................2");
                Console.WriteLine("Received Response==>" + x);
            });
        }
    }`

Kelas Konstan untuk Permintaan dan Respons:

`public class REQ_RESP
    {
        private static string receivedAction = "";
        private static string receivedPostDate = "";


        public static IObservable<string> postAndGetResponse(String postData)
        {
            if (GlobalConstants.isGetToken)
            {
    //Pre Request for every reusest               
                receivedPostDate = postData;
                GlobalConstants.isGetToken = false;
                getServerTokenMethod();
                postData = receivedPostDate;
            }

            HttpWebRequest serviceRequest =
            (HttpWebRequest)WebRequest.Create(new Uri(Constants.SERVICE_URI));


            var fetchRequestStream =
                 Observable.FromAsyncPattern<Stream>(serviceRequest.BeginGetRequestStream,
                                                                 serviceRequest.EndGetRequestStream);
            var fetchResponse =
                Observable.FromAsyncPattern<WebResponse>(serviceRequest.BeginGetResponse,
                                                            serviceRequest.EndGetResponse);

            Func<Stream, IObservable<HttpWebResponse>> postDataAndFetchResponse = st =>
            {
                using (var writer = new StreamWriter(st) as StreamWriter)
                {
                    writer.Write(postData);
                    writer.Close();
                }
                return fetchResponse().Select(rp => (HttpWebResponse)rp);
            };

            Func<HttpWebResponse, IObservable<string>> fetchResult = rp =>
            {
                if (rp.StatusCode == HttpStatusCode.OK)
                {

                    using (var reader = new StreamReader(rp.GetResponseStream()))
                    {
                        string result = reader.ReadToEnd();
                        reader.Close();
                        rp.GetResponseStream().Close();
                        XDocument xdoc = XDocument.Parse(result);
                        Console.WriteLine(xdoc);
                        return Observable.Return<string>(result);
                    }
                }
                else
                {
                    var msg = "HttpStatusCode == " + rp.StatusCode.ToString();
                    var ex = new System.Net.WebException(msg,
                        WebExceptionStatus.ReceiveFailure);
                    return Observable.Throw<string>(ex);
                }

            };

            return
                from st in fetchRequestStream()
                from rp in postDataAndFetchResponse(st)
                from str in fetchResult(rp)
                select str;
        }

        public static void getServerTokenMethod()
        {
            SecurityToken token = new SecurityToken();

            var getTokenResults = REQ_RESP.postAndGetResponse((new ServerToken().GetServerToken()));

            getTokenResults.Subscribe(x =>
            {
                ServerToken serverToken = new ServerToken();
                ServiceModel sm = new ServiceModel();
    //Parsing Response
                serverToken = extract(x, sm);
                if (!(string.IsNullOrEmpty(sm.NetErrorCode)))
                {
        MessageBox.Show("Show Error Message");
                }
                else
                {
                    Console.WriteLine("\n\n..................................1");
                    Console.WriteLine("\n\nserverToken.token==>" + serverToken.token);
                    Console.WriteLine("\n\nserverToken.pk==>" + serverToken.pk);                   
                }
            },
            ex =>
            {
                MessageBox.Show("Exception = " + ex.Message);
            },
            () =>
            {
                Console.WriteLine("End of Process.. Releaseing all Resources used.");
            });
        }
    }`

person Vijay    schedule 28.02.2015    source sumber


Jawaban (1)


Berikut beberapa opsi:

Anda dapat mengganti model Ekstensi Reaktif dengan model async/await yang lebih sederhana untuk permintaan web menggunakan HttpClient (Anda juga memerlukan Microsoft.Bcl.Async di WP7). Dengan HttpClient kode Anda akan terlihat seperti ini:

Permintaan dan Tanggapan:

        public static async Task<string> postAndGetResponse(String postData)
    {
        if (GlobalConstants.isGetToken)
        {
            //Pre Request for every reusest               
            await getServerTokenMethod();
        }

        var client = new HttpClient();
        var postMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(Constants.SERVICE_URI));
        var postResult = await client.SendAsync(postMessage);

        var stringResult = await postResult.Content.ReadAsStringAsync();

        return stringResult;
    }

Model tampilan:

    public class ListExampleViewModel
{
    SecurityToken sToken = null;
    public ListExampleViewModel()
    {
        GetData();
    }

    public async void GetData()
    {
        GlobalConstants.isGetToken = true;
        var listResults = await REQ_RESP.postAndGetResponse("postData");
    }
}

Pilihan lainnya adalah, jika Anda ingin terus menggunakan Ekstensi Reaktif, lihat metode Concat RX. Dengan itu Anda dapat merangkai permintaan token dan permintaan web sebenarnya: https://stackoverflow.com/a/6754558/66988

person Mikael Koskinen    schedule 28.02.2015
comment
Hai, saya mencoba mengikuti opsi pertama Anda. Tapi saya tidak bisa melakukan itu. Saya menghadapi beberapa kesalahan. The type or namespace name 'async' could not be found (are you missing a using directive or an assembly reference?). Saya mencari solusi untuk kesalahan ini. Dan saya menemukan satu jawaban [Dari Tautan ini].(stackoverflow.com/questions/16557032/). Saya sendiri menyimpulkan bahwa ini tidak mungkin. Sekarang saya mencoba dengan opsi kedua Anda. Tapi saya tidak tahu di mana saya harus menambahkan metode itu. Jika memungkinkan tolong beri tahu saya cara apa pun untuk menyelesaikan masalah saya. - person Vijay; 28.02.2015
comment
Hai @Mikael Koskinen.. Akhirnya saya menemukan solusinya. Saya menggunakan o1().SelectMany(_ =› o2()).Subscribe(); untuk solusi saya dan melakukan beberapa perubahan pada kode saya. Sekarang saya bisa mengirimkan pra permintaan..!! Terima kasih banyak.. - person Vijay; 02.03.2015