从silverlight调用外部网站

时间:2010-02-14 19:35:25

标签: c# silverlight httpwebrequest

我正在写一个小银光应用程序只是为了试试silverlight。我的想法是制作一个小应用程序来检查网站是否在线。它通过用户输入URL来工作,我的应用程序每5分钟检查一次正常运行时间。

但是当我做webrequest时,我会得到下面的安全例外。阅读http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(VS.95).aspx似乎表明silverlight不允许跨域连接。那么,没有办法让我的想法在Silverlight中工作吗?

示例代码:

     WebRequest testHTTP = null;
            try
            {
                testHTTP = WebRequest.Create(serverToCheck);
            }
            catch (UriFormatException ufe)
            {
                try
                {
                    testHTTP = WebRequest.Create("http://" + serverToCheck);
                }
                catch (UriFormatException ufe1)
                {
                    MessageBox.Show("Invalid server address");

                }
            }
            if (testHTTP != null)
            {
                testHTTP.BeginGetResponse(new AsyncCallback(doCheck), testHTTP); 

                }

  void doCheck(IAsyncResult a)
    {
        try
        {
            HttpWebRequest req = (HttpWebRequest)a.AsyncState;
            HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a);

             Dispatcher.BeginInvoke(() => HTTPStatus.Content = "OK");

        }
        catch (Exception ex)
        {
  //handle exception
        }

    }

例外: {System.Security.SecurityException ---> System.Security.SecurityException:安全性错误。    在System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)    在System.Net.Browser.BrowserHttpWebRequest。<> c__DisplayClass5.b__4(Object sendState)    在System.Net.Browser.AsyncHelper。<> c__DisplayClass2.b__0(Object sendState)    ---内部异常堆栈跟踪结束---    在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,Object state)    在System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)    在monitor.Home.doCheck(IAsyncResult a)}

4 个答案:

答案 0 :(得分:3)

您无法在Silverlight 3中覆盖服务器的跨域策略。在Silverlight 4中,您可以使用受信任的“浏览器外”应用程序。

您最好的办法是创建一个与托管Silverlight应用程序的域相同的域上运行的服务,然后让它进行检查。

答案 1 :(得分:0)

您可以在ASP.Net中创建一个连接到任何网站的服务器端页面,并告诉您它是否已启动。
由于它将与您的Silverlight应用程序托管在同一个域中,因此它可以正常工作。 (ASP.Net没有这样的限制)

请注意,它会检查服务器是否可以连接到网站而不是客户端。

答案 2 :(得分:0)

您尝试访问的网站要求提供跨域策略文件以允许访问。仲裁网站不太可能有这些,所以你试图做的事情被阻止了。

答案 3 :(得分:0)

我猜目标URI需要root中的clientaccesspolicy.xml或crossdomain.xml文件。解决方案可能是在服务器上创建一个处理请求的WCF服务。