2010-02-14 70 views
1

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

但是,当我做网络请求时,我会得到下面的安全例外。阅读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:安全错误。 at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest。 <> c__DisplayClass5.b__4(Object sendState) at System.Net.Browser.AsyncHelper。 <> c__DisplayClass2.b__0(Object sendState) --- End of internal exception stack trace --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,Object state) at System.Net.Browser.BrowserHttpWebRequest。 EndGetResponse(IAsyncResult asyncResult) at monitor.Home.doCheck(IAsyncResult a)}

回答

3

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

最好的办法是创建一个与托管Silverlight应用程序的服务在同一个域上运行的服务,并让它执行检查。

0

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

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

0

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

0

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