我正在写一个小银光应用程序只是为了试试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)}
答案 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服务。