Silverlight غير المتزامن 4 دعوة إلى عالم Warcraft Armory Streaming XML في C#

StackOverflow https://stackoverflow.com/questions/2893272

سؤال

لقد تعثرت في هذا الأسبوع وفشلت فشلاً ذريعًا!
الرجاء مساعدتي في إعادة عقلاني !!

التحدي الخاص بك

لأول تطبيق Silverlight الخاص بي ، اعتقدت أنه سيكون من الممتع استخدام World of Warcraft Armory لإدراج الشخصيات الموجودة في نقابتي. وهذا ينطوي على صنع غير متزامن من Silverlight (duh!) إلى Wow Armory الذي يعتمد على XML. بسيطة إيه؟

ألقِ نظرة على هذا الرابط وفتح المصدر. سترى ما أعنيه:http://eu.wowarmory.com/guild-info.xml؟r=eonar&n=gifted وموهوب

فيما يلي رمز للحصول على XML (ستتعامل مكالمة العروض للمنفذات مع XML التي تم إرجاعها - لقد اختبرت هذا محليًا وأعلم أنه يعمل).

لم أتمكن من الحصول على XML المتوقع على الإطلاق.

ملحوظات:

  • إذا كان المتصفح قادرًا على تحويل XML ، فسيتم توفير ذلك ، وإلا فسيتم توفير HTML. أعتقد أنه يفحص المستخدم
  • أنا مطور ويب ASP.NET محنك C# لذا اذهب بسهولة إذا بدأت في الحديث عن نماذج Windows / WPF
  • لا يمكنني أن أتعين تعيين إعداد المستخدم في .NET 4.0 - لا يبدو أنه خاصية من كائن httpwebrequest لسبب ما - أعتقد أنه كان متاحًا.
  • Silverlight 4.0 (تم إنشاؤه كـ 3.0 في الأصل قبل تحديث تثبيت Silverlight إلى 4.0)
  • تم إنشاؤه باستخدام C# 4.0
  • يرجى التوضيح كما لو كنت تتحدث إلى مطور ويب وليس برمجة مناسبة لول!

فيما يلي الرمز - يجب أن يعيد XML من Wow Armory.

private void button7_Click(object sender, RoutedEventArgs e)
{
   // URL for armoury lookup
                string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented";

                // Create the web request
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

                // Set the user agent so we are returned XML and not HTML
                //httpWebRequest.Headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";

                // Not sure about this dispatcher thing - it's late so i have started to guess.
                Dispatcher.BeginInvoke(delegate()
                {
                    // Call asyncronously
                    IAsyncResult asyncResult = httpWebRequest.BeginGetResponse(ReqCallback, httpWebRequest);

                    // End the response and use the result
                    using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult))
                    {
                        // Load an XML document from a stream
                        XDocument x = XDocument.Load(httpWebResponse.GetResponseStream());

                        // Basic function that will use LINQ to XML to get the list of characters.
                        ShowGuildies(x);
                    }
                });
            }

            private void ReqCallback(IAsyncResult asynchronousResult)
            {
                // Not sure what to do here - maybe update the interface?
            }

أتمنى حقًا أن يساعدني شخص ما!

شكرا جزيلا! دان.

ملاحظة: لقد لاحظت المفارقة باسم النقابة :)

هل كانت مفيدة؟

المحلول

أولاً، Dispatcher.BeginInvoke هناك حاجة فقط عندما تكون على موضوع آخر من موضوع واجهة المستخدم (حيث يحدث كل شيء Silverlight/WPF). في حدث نقرة ، أنت بالفعل في موضوع واجهة المستخدم ، لذلك ليست هناك حاجة إلى الاتصال به.

ثانيا، BeginGetResponse هي عملية غير متزامنة ، لذلك عند الانتهاء ، ستسمي وظيفة رد الاتصال على موضوع آخر ، هنا ReqCallback. في هذه الطريقة يمكنك الاتصال EndGetResponse. ينطبق هذا النمط على كل BeginX/endx ستجدها في الإطار.

ومع ذلك ، نظرًا لأنك في موضوع آخر ، ستحتاج إلى استخدام BeginInvoke لإرسال طريقة العودة إلى موضوع واجهة المستخدم.

سيبدو الرمز هكذا:

private void button7_Click(object sender, RoutedEventArgs e) {
    string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented";
    HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(url);
    httpWebRequest.BeginGetResponse(ReqCallback, httpWebRequest);
}

private void ReqCallback(IAsyncResult asyncResult)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest) asyncResult.AsyncState;
    using (HttpWebResponse httpWebResponse = (HttpWebResponse) httpWebRequest.EndGetResponse(asyncResult))
    {
        XDocument x = XDocument.Load(httpWebResponse.GetResponseStream());
        Dispatcher.BeginInvoke((Action) (() => ShowGuildies(x)));
    }
}

لاحظ أنه يمكنك أيضًا معالجة XML في مؤشر الترابط واستخدام المرسل فقط لإرسال النقابات إلى واجهة المستخدم ، لتجنب تجميد واجهة المستخدم إذا كانت XML طويلة جدًا لتحليلها (لا ينبغي أن تكون كذلك).

يحرر: تصحيح الرمز. عليك فقط التنفيذ ShowGuildies. فيما يتعلق بالاتصال بالإنترنت والتأخير ، نظرًا لأن العملية تحدث في موضوع آخر ، فلن يتجمد واجهة المستخدم. قد تفكر في إظهار الرسوم المتحركة تحميل أو شيء من هذا القبيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top