【问题标题】:WebClient security error when accessing the world of warcraft armoury访问魔兽世界军械库时WebClient安全错误
【发布时间】:2010-05-24 20:43:01
【问题描述】:

我正在尝试拼凑一个问题的解决方案。 基本上,我使用 Silverlight 4 和 C# 4.0 来访问魔兽世界的军械库。 如果有人这样做 - 请哦,请提供有效的 .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 文件 - 但我相信如果请求不是来自支持 XML 转换的浏览器,它会恢复为 html。但我认为我并没有走到这一步。
  3. 军械库上有一个跨域策略文件 - 这可能是错误的原因(不确定!
  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。

有没有聪明的编码大师可以在睡梦中解决这个问题?

如果你能帮忙,谢谢。

【问题讨论】:

  • 你能发布使用的解决方案吗? (WCF服务的实现)
  • 好吧,这没有任何意义,因为 wow 不再通过 XML 服务公开他们的数据。耻辱 - 这是一组很棒的数据。

标签: c# silverlight security world-of-warcraft


【解决方案1】:

在浏览器中运行 Silverlight 应用程序时,silverlight 应用程序只能向来自安装应用程序所在域的 URL 发出请求。例如,如果您的 silverlight 应用程序是从 http://yoursite.com/yourapp.xap 安装的,则您只能向 http://yoursite.com/ 上的其他 URL 发出 WebClient 请求。您在此处的选择是创建一个从您的服务器请求 WoW 军械库的代理脚本,并让您的 silverlight 应用程序访问该代理,或者在浏览器外运行 silverlight 并请求完全信任。

编辑:通常最好的选择是跨域策略文件,如here 所述。遗憾的是,wowarmory.com 似乎没有实现跨域策略文件。

【讨论】:

  • 理论上听起来不错,但这段代码改编自 Scott Gu 的博客,请参阅weblogs.asp.net/scottgu/pages/… 这个示例显然在另一台服务器上使用了 digg 服务器。与这个看似矛盾的例子相比,你能解释一下你的评论吗?非常感谢!
  • Digg 为 silverlight 实现了跨域策略文件。 Wowarmory.com 没有:(
  • 很高兴知道 digg :)
【解决方案2】:

你在正确的轨道上,你只需要设置用户代理。

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

【讨论】:

  • ooooo - 这就是您在 .net 4.0 中设置用户代理字符串的方式。迫不及待想尝试一下 - 我一定会告诉你结果如何!
  • 我收到一条错误消息,指出无法直接修改用户代理... + InnerException {System.ArgumentException: 无法直接修改“用户代理”标头。参数名称: System.Net.WebHeaderCollection.Add(String name, String value) at System.Net.HttpWebRequest.set_Headers(WebHeaderCollection value) at System.Net System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String name, String value) 的名称.WebClient.CopyHeadersTo(WebRequest request) at System.Net.WebClient.GetWebRequest(Uri address) ....
  • 抱歉,我没有意识到这是一个 Silverlight 应用程序。
  • 昨晚我在 WPF 中尝试了它 - 您的代码在那里工作,整个应用程序按预期工作,但由于某种原因我无法理解,它在 Silverlight 中不起作用。
  • 已解决 - 由于跨域安全性和标头修改限制,使用 WCF 服务充当代理。感谢您的所有建议。
【解决方案3】:

已解决 - 由于跨域安全和标头修改限制,使用 WCF 服务充当代理。谢谢大家的建议。

【讨论】:

  • 仅供参考 - WoW 现在公开了一项基于休息的服务,因此我的问题和任何答案都已过时。数据以 JSON 形式返回。我认为您收到了如此多的 API 调用,那么您可能需要向他们请求额外的权限以进行大型应用程序调用。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多