Ошибка безопасности WebClient при доступе к арсеналу World of Warcraft
Я пытаюсь собрать воедино решение проблемы. В основном я использую 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!");
}
}
Заметки:
- C# 4.0
- Оружейная база представляет собой файл XML - но я считаю, что он возвращается к HTML, если запрос не от браузера, который поддерживает преобразование XML. Но я не думаю, что захожу так далеко.
- В арсенале есть файл междоменной политики - это может быть причиной ошибки (не уверен!
- Я загрузил на производственный сервер
- Я тестирую его локально с помощью веб-сайта IIS
- Я схожу с ума!
- Веб-сайты высказывают предположение, что эту проблему можно решить, создав веб-прокси, но я не знаю, как это сделать.
Было бы здорово, если бы кто-то смог принять этот вызов и показать нам всем, что это возможно. Я предпочел бы сначала решение без прокси, а затем попробую прокси.
Детали ошибки:
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
, вы можете только делать запросы WebClient к другим URL-адресам на http://yoursite.com/
, Здесь вы можете либо создать прокси-скрипт, который запрашивает оружейный WoW с вашего сервера, и заставить ваше приложение silverlight подключиться к этому прокси, либо запустить silverlight вне браузера и запросить полное доверие.
Изменить: как правило, лучший вариант - это файл междоменной политики, как описано здесь. К сожалению, не похоже, что wowarmory.com реализует файл междоменной политики.
Вы были на правильном пути, вам просто нужно установить 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!");
}
}