C# 异步Silverlight 4调用魔兽世界armoury在C中传输XML#

C# 异步Silverlight 4调用魔兽世界armoury在C中传输XML#,c#,silverlight,asynchronous,world-of-warcraft,C#,Silverlight,Asynchronous,World Of Warcraft,我整个周末都被困在这上面,失败得很惨 请帮我恢复理智 你的挑战 对于我的第一个Silverlight应用程序,我认为使用魔兽世界军械库列出我公会中的角色会很有趣。这涉及到从Silverlight(duh!)到基于XML的WoW Armory的异步转换。简单,嗯 查看此链接并打开源代码。你会明白我的意思: 才华横溢 下面是获取XML的代码(对ShowGuilldies的调用将处理返回的XML-我已经在本地测试过,我知道它可以工作) 我根本没有获得预期的返回XML 注意事项: 如果浏览器能够转换X

我整个周末都被困在这上面,失败得很惨
请帮我恢复理智

你的挑战

对于我的第一个Silverlight应用程序,我认为使用魔兽世界军械库列出我公会中的角色会很有趣。这涉及到从Silverlight(duh!)到基于XML的WoW Armory的异步转换。简单,嗯

查看此链接并打开源代码。你会明白我的意思: 才华横溢

下面是获取XML的代码(对ShowGuilldies的调用将处理返回的XML-我已经在本地测试过,我知道它可以工作)

我根本没有获得预期的返回XML

注意事项:

  • 如果浏览器能够转换XML,它将这样做,否则将提供HTML。我认为它检查用户代理
  • 我是一名经验丰富的asp.net web开发人员C#因此,如果您开始谈论Windows窗体/WPF的本机特性,那么请轻松一点
  • 我似乎无法在.net 4.0中设置UserAgent设置-出于某种原因,它似乎不是HttpWebRequest对象的属性-我认为它以前是可用的
  • Silverlight 4.0(在我将Silverlight安装更新为4.0之前,最初创建为3.0)
  • 使用C#4.0创建
  • 请解释一下,就像你在和一个网络开发人员交谈,而不是一个合适的编程lol
下面是代码-它应该从wow Armory返回XML

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?
            }
真希望有人能帮我

谢谢你! 丹


PS是的,我注意到了公会名称中的讽刺:)

首先,
调度程序。只有当您在UI线程以外的其他线程上时(在UI线程中,所有与silverlight/WPF相关的事情都会发生),才需要BeginInvoke
。单击事件时,您已经在UI线程中,因此无需调用它

其次,
BeginGetResponse
是一个异步操作,因此当它完成后,它将调用另一个线程上的回调函数,这里是
ReqCallback
。在这个方法中,您可以调用
EndGetResponse
。此模式适用于框架中的每个BeginX/EndX

但是,由于您处于另一个线程中,因此需要使用
BeginInvoke
将方法分派回UI线程

代码如下所示:

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,并仅使用dispatcher将Guidies发送回UI,以避免在需要解析的XML很长(不应该是这样)时冻结UI


编辑:已更正代码。您只需实现
ShowGuildies
。关于internet连接和延迟,由于操作发生在另一个线程中,UI不会冻结。您可能会考虑显示加载动画或一些东西。

对不起-代码不编译。你能邮寄一份工作样品吗?我正在努力让它工作,而更多不起作用的代码将给我带来更大的压力:)1。httpWebRequest在ReqCallBack 2中不存在。(动作)部分()=>ShowGuildies(x)我真的很感谢你的帮助,最后一点听起来很有趣-虽然解析时间不多,但我还必须处理时间延迟和互联网连接。干杯此外,我也看到了许多我尝试过但不起作用的例子。对于这样一个简单的例子,使用上面的链接-如果能看到一位专家让它工作,那就太好了-整个周末-我现在疯了:)嗨,朱利安,谢谢你更新的代码,我会尝试一下,看看我能走多远。也许在我睡觉后,事情会变得更有意义。不管怎样,我都会让你知道结果的。我已经针对xml文件的本地版本实现了showGuillides,所以希望上面的内容能够起到作用!我想我们就快到了,但我现在确实遇到了一个安全错误(即使我上传到生产服务器上)。最简单的内部错误是“安全错误”。不是非常有用!有一个跨域策略文件可能会导致这种情况,但不知道如何避免!?在System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)在System.Net.Browser.Browser.AsyncHelper.c_uuuDisplayClass2.b_u0(对象发送状态)在System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult asyncResult)中已解决-由于跨域安全和标头修改限制,使用WCF服务充当代理。谢谢你的建议。