Ошибка безопасности WebClient при доступе к оружейному миру Warcraft - PullRequest
1 голос
/ 25 мая 2010

Я пытаюсь собрать решение проблемы. В основном я использую Silverlight 4 с C # 4.0 для доступа к арсеналу Warcraft. Если кто-то сделал это - пожалуйста, предоставьте рабочий код .net 4.0.

Код, который я пытаюсь запустить (e.Error содержит ошибку безопасности):

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. C # 4.0
  2. Оружейная база представляет собой XML-файл, но я считаю, что он возвращается к html, если запрос не поступил от браузера, поддерживающего преобразование XML. Но я не думаю, что захожу так далеко.
  3. На складе хранится файл междоменной политики - это может быть причиной ошибки (не уверен!
  4. Я загрузил на рабочий сервер
  5. Я тестирую его локально, используя веб-сайт IIS
  6. Я схожу с ума!
  7. Веб-сайты высказывают предположение, что эту проблему можно решить путем создания веб-прокси, но я не имею ни малейшего понятия, как это сделать.

Было бы здорово, если бы кто-то смог принять этот вызов и показать нам всем, что это возможно. Сначала я предпочел бы решение без прокси, а затем попробовал бы прокси.

Сведения об ошибке:

e.Error = {System.Security.SecurityException ---> System.Security.SecurityException: ошибка безопасности. в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult) в System.Net.Browser.BrowserHttpWebRequest. <> c__DisplayClass5.

Есть какие-нибудь умные мастера кодировщиков, которые могут решить это во сне?

Спасибо, если вы можете помочь.

Ответы [ 3 ]

3 голосов
/ 25 мая 2010

При запуске приложения Silverlight в браузере приложение Silverlight может отправлять запросы только на URL-адреса из того же домена, с которого было установлено приложение. Например, если ваше приложение silverlight установлено с http://yoursite.com/yourapp.xap, вы можете отправлять запросы WebClient только на другие URL-адреса на http://yoursite.com/. Здесь вы можете либо создать прокси-скрипт, который запрашивает оружейный WoW с вашего сервера, и заставить приложение silverlight подключиться к этому прокси, либо запустить silverlight вне браузера и запросить полное доверие.

Редактировать: Обычно лучшим вариантом является файл междоменной политики, как объяснено здесь . К сожалению, похоже, что wowarmory.com не реализует файл междоменной политики.

1 голос
/ 27 мая 2010

решено - служба WCF использовалась в качестве прокси из-за междоменной безопасности и ограничений модификации заголовка. Спасибо за все советы.

1 голос
/ 25 мая 2010

вы были на правильном пути, вам просто нужно установить user-agent.

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!");
        }
    } 
...