Silverlight的WebClient未连接到我的服务器

时间:2009-03-14 16:10:11

标签: asp.net httpwebrequest silverlight-2.0 webclient

我在这里遇到了问题。

我有一个ASP.net网站托管silverlight 2应用程序。 我希望该网站能够在silverlight应用程序中来回通信,而我正在通过http请求进行此操作。顺便说一句,如果有人知道更好的方法,请告诉我。

我的服务器设置了以下http侦听器。我从一个教程网站上复制了这个,因为它主要是实验:

      HttpListener listener = new HttpListener (  );
      listener.Prefixes.Add("http://localhost:4531/MyApp/");  
      listener.Start(  );                                         

      // Wait for a client request:
      HttpListenerContext context = listener.GetContext(  );

      // Respond to the request:
      string msg = "You asked for: " + context.Request.RawUrl;
      context.Response.ContentLength64 = Encoding.UTF8.GetByteCount (msg);
      context.Response.StatusCode = (int) HttpStatusCode.OK;

      using (Stream s = context.Response.OutputStream)
      using (StreamWriter writer = new StreamWriter (s))
        writer.Write (msg);

      listener.Stop(  );

我正在使用以下代码发送请求:

 private void MyButton_Click(object sender, RoutedEventArgs e)
        {
            Button b = sender as Button;
            b.Content = "Hello World";

            Uri serviceUri = new Uri("http://localhost:4531/MyApp/");
            WebClient downloader = new WebClient();
            downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TestDownloadStoriesCompleted);
            downloader.DownloadStringAsync(serviceUri);

        }
        void TestDownloadStoriesCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                TextBox1.Text = e.Result;
            }
        }

我的问题是我可以使用几乎相同的代码从控制台应用程序连接到Web服务器(我通过在代码中设置断点来测试它),但是当我点击silverlight中的按钮时没有任何反应。 (我添加了“Hello World”来测试我确实将委托连接到按钮。)

我已经读过Silverlight需要通过webclient连接的策略,但如果我为服务器和silverlight应用程序使用相同的服务器和相同的域,则情况不应该如此!

感谢您的所有回复!

编辑:我收到了这个例外:

System.Security.SecurityException ---> System.Security.SecurityException:安全错误。

此外,基于我reading显然是原始站点,xap的部署URI和请求URI也必须是同一个端口。

但是,当我将服务器的属性设置为托管在特定端口上,并且我将侦听器设置为侦听同一个端口时,它会失败并显示以下消息:进程因为正在使用而无法访问该文件通过另一个过程。我假设这是因为http侦听器无法侦听用于托管它的相同端口:| 但是,我怎样才能让Silverlight执行原始webclient请求的主机?

3 个答案:

答案 0 :(得分:1)

由于这只是一个测试添加“else TextBox1.Text = e.Error.ToString();”在你的TestDownloadStoriesCompleted处理程序中查看你得到的错误。

编辑:

您不能在同一端口上托管asp.net应用程序和侦听器 - 您可以通过使用其他端口并从httplistener提供clientaccesspolicy.xml来解决此问题。

但是我认为你看看WCF网络服务(你将svc添加到你的asp.net应用程序中)会更有意义。这是一个sample

答案 1 :(得分:1)

您可以使用http://www.fiddler2.com/fiddler2/等工具 实际上看到请求期间发生了什么.... 这可以为进一步调试提供一些帮助......

答案 2 :(得分:0)

我现在正在使用HTTP处理程序进行通信。虽然我还想尝试一些WCF,但它们似乎能够很好地完成我的工作。