سؤال

أحاول تجميع حل لمشكلة ما. في الأساس ، أستخدم Silverlight 4 مع C# 4.0 للوصول إلى عالم World of Warcraft Armory. إذا كان أي شخص قد فعل هذا - من فضلك أوه ، يرجى تقديم رمز العمل .NET 4.0.

الرمز الذي أحاول تشغيله هو (E.Error يحتوي على خطأ Securtiy):

private void button10_Click(object sender, RoutedEventArgs e)
        {
            string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented"; 
            WebClient wc = new WebClient();

            // HOW DO I ADD A USER AGENT STRING (RESPONSE MAY VARY (I.E. HTML VS XML) IF PAGE THINKS CALL IS NOT CAPABABLE OF SUPPORTING XML TRANSFORMATIONS) 
            //wc.ResponseHeaders["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";

            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri(url));    
        }

        void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                string result = e.Result;

                XDocument ArmouryXML = XDocument.Parse(result);

                ShowGuildies(ArmouryXML);
            }
            else
            {
                MessageBox.Show("Something is complaining about security but not sure what!");
            }
        } 

ملحوظات:

  1. ج# 4.0
  2. Armory هو ملف XML - لكنني أعتقد أنه يعود إلى HTML إذا لم يكن الطلب من متصفح يدعم تحويل XML. لكني لا أعتقد أنني أتحمل هذا الحد.
  3. يحتوي Armory على ملف سياسة المجال المتقاطع عليه - قد يكون هذا هو سبب الخطأ (غير متأكد!
  4. لقد قمت بتحميله على خادم الإنتاج
  5. أنا أختبرها محليًا باستخدام موقع IIS
  6. أنا ذاهب مجنون!
  7. قدمت مواقع الويب اقتراحًا بأن هذه المشكلة يمكن التغلب عليها من خلال إنشاء WebProxy - لكن ليس لدي أول فكرة عن كيفية القيام بذلك.

سيكون من الرائع أن يواجه شخص ما هذا التحدي ويظهر لنا كل ما هو ممكن. أفضل حلًا غير بروكسي أولاً ، ثم جرب وكيلًا.

تفاصيل الخطأ:

e.error = {system.security.securityexception ---> System.Security.SecurityException: خطأ أمان. في system.net.browser.browserhttpwebrequest.internalendgetResponse (iasyncresult asyncresult) في system.net.browser.browserhttpwebrequest. <> c__displayclass5.

أي المبرمجون الرئيسيين الذكيين يمكنهم حل هذا في نومهم؟

شكرا إذا كنت تستطيع المساعدة.

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

المحلول 3

حل - استخدم خدمة WCF لتكون بمثابة وكيل بسبب أمان النطاق المتقاطع وقيود تعديل الرأس. شكرا على كل النصائح.

نصائح أخرى

عند تشغيل تطبيق Silverlight في المتصفح ، قد يقوم تطبيق Silverlight فقط بتقديم طلبات إلى عناوين URL من نفس المجال الذي تم تثبيته من التطبيق. على سبيل المثال ، إذا تم تثبيت تطبيق Silverlight الخاص بك http://yoursite.com/yourapp.xap, ، يمكنك فقط تقديم طلبات ويب إلى عناوين URL الأخرى http://yoursite.com/. خياراتك هنا هي إما إنشاء برنامج نصي وكيل يطلب من Wow Armory من الخادم الخاص بك ، وضرب تطبيق Silverlight الخاص بك هذا الوكيل ، أو تشغيل Silverlight خارج المقبض وطلب الثقة الكاملة.

تحرير: بشكل عام الخيار الأفضل هو ملف سياسة المجال المتقاطع كما هو موضح هنا. للأسف ، لا يبدو أن wowarmory.com ينفذ ملف سياسة المجال المتقاطع.

كنت على المسار الصحيح ، تحتاج فقط إلى تعيين وكيل المستخدم.

private void button10_Click(object sender, RoutedEventArgs e)
    {
        string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented"; 
        WebClient wc = new WebClient();

        // HOW DO I ADD A USER AGENT STRING (RESPONSE MAY VARY (I.E. HTML VS XML) IF PAGE THINKS CALL IS NOT CAPABABLE OF SUPPORTING XML TRANSFORMATIONS) 
        //wc.ResponseHeaders["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";

        wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";
        wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
        wc.DownloadStringAsync(new Uri(url));    
    }

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            string result = e.Result;

            XDocument ArmouryXML = XDocument.Parse(result);

            ShowGuildies(ArmouryXML);
        }
        else
        {
            MessageBox.Show("Something is complaining about security but not sure what!");
        }
    } 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top