วิธีส่งคำขอล่วงหน้าก่อนทุกคำขอใน windows phone 7

ฉันต้องการส่งคำขอล่วงหน้าหนึ่งรายการไปยังเซิร์ฟเวอร์ของฉันก่อนที่จะส่งทุกคำขอ จากคำขอล่วงหน้านั้น ฉันจะได้รับโทเค็นจากเซิร์ฟเวอร์ของฉัน และฉันต้องเพิ่มโทเค็นนั้นลงในคำขอทั้งหมด นี่คือกระบวนการ

ฉันได้ลองวิธีการบางอย่างเพื่อให้บรรลุเป้าหมายนี้ แต่ฉันกำลังประสบปัญหาหนึ่ง นั่นคือเมื่อฉันพยายามส่งคำขอล่วงหน้า มันกำลังประมวลผลคำขอปัจจุบัน นั่นหมายถึงคำขอทั้งสองขนานกัน

ฉันต้องการส่งคำขอล่วงหน้าก่อนและแยกวิเคราะห์การตอบกลับ หลังจากแยกวิเคราะห์การตอบกลับคำขอล่วงหน้าแล้วเท่านั้น ฉันต้องการส่งคำขออื่นนั้น แต่คำขอแรกไม่รอการตอบกลับคำขอล่วงหน้า โปรดให้ฉันส่งคำขอล่วงหน้าก่อนที่จะส่งคำขอทั้งหมด

นี่คือรหัสของฉัน:

ดูโมเดล:

`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);
            });
        }
    }`

คลาสคงที่สำหรับคำขอและการตอบสนอง:

`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 แหล่งที่มา


คำตอบ (1)


นี่คือตัวเลือกสองสามอย่าง:

คุณสามารถแทนที่โมเดล Reactive Extensions ด้วย async/await -model ที่ง่ายกว่าสำหรับคำขอเว็บโดยใช้ HttpClient (คุณต้องมี Microsoft.Bcl.Async ใน WP7) ด้วย HttpClient รหัสของคุณจะมีลักษณะดังนี้:

คำขอและการตอบสนอง:

        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;
    }

ดูโมเดล:

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

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

อีกทางเลือกหนึ่งคือ หากคุณต้องการใช้ Reactive Extensions ต่อไป ให้ดูที่วิธี Concat ของ RX ด้วยสิ่งนี้ คุณสามารถเชื่อมโยงคำขอโทเค็นและคำขอเว็บจริงได้: https://stackoverflow.com/a/6754558/66988

person Mikael Koskinen    schedule 28.02.2015
comment
สวัสดี ฉันพยายามที่จะปฏิบัติตามตัวเลือกแรกของคุณ แต่ฉันไม่สามารถทำอย่างนั้นได้ ฉันกำลังเผชิญกับข้อผิดพลาดบางอย่าง The type or namespace name 'async' could not be found (are you missing a using directive or an assembly reference?). ฉันกำลังค้นหาวิธีแก้ไขข้อผิดพลาดนี้ และฉันพบคำตอบหนึ่งข้อ [จากลิงก์นี้] (stackoverflow.com/questions/16557032/) ฉันสรุปตัวเองว่ามันเป็นไปไม่ได้ ตอนนี้ฉันกำลังลองใช้ตัวเลือกที่สองของคุณ แต่ฉันไม่รู้ว่าจะต้องเพิ่มวิธีการนั้นที่ไหน ถ้าเป็นไปได้โปรดให้ฉันมีวิธีแก้ไขปัญหาของฉัน - person Vijay; 28.02.2015
comment
สวัสดี @Mikael Koskinen .. ในที่สุดฉันก็พบวิธีแก้ปัญหา ฉันใช้ o1().SelectMany(_ =› o2()).Subscribe(); สำหรับวิธีแก้ปัญหาของฉันและทำการเปลี่ยนแปลงบางอย่างในโค้ดของฉัน ตอนนี้ส่ง Pre Request ได้แล้ว..!! ขอบคุณมาก.. - person Vijay; 02.03.2015