我们使用Silverlight作为Web界面的解决方案。我们有一个现有的Web服务,但将crossdomain和clientaccesspolicy文件放在服务器的根目录是我们的最后手段,所以我们首先探索其他选项。我已经决定了另一种方法是使用HtmlPage.Window.Invoke()并使用javascript调用webservice,接收JSON数据,并将其返回到Silverlight环境,我会相应地解析它。我遇到了两个问题:
如果我同步调用它,我的UI线程会冻结,直到调用完成,我不知道如何解决它。我的印象是UI线程是唯一可以访问javascript的线程。
如果我异步调用它,我不知道如何在readyState == 4之前返回数据。有什么想法吗?
答案 0 :(得分:3)
以下是应该在大多数最新浏览器上运行的基本XmlHttpRequest
解决方案: -
使用Javascript: -
function getSomeJSON(url, callback)
{
var result = null;
var xhr = new XmlHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechanged = function()
{
if (xhr.readyState == 4)
{
if (xhr.status == 200)
{
result = xhr.responseText;
}
xhr = null;
callback(result);
}
}
xhr.send(null);
}
在Silverlight C#中
void FetchData()
{
string url = GenerateUrlForService();
HtmlPage.Window.Invoke("getSomeJSON", new Action<string>(jsonResult =>
{
// Code here to handle the json string result.
// This will run asynchronously so should not block the UI thread
// for the duration of the web service call.
}));
}