2011-03-03 50 views
2

我們使用Silverlight作爲我們的Web界面解決方案。我們有一個現有的網絡服務,但將一個跨域和clientaccesspolicy文件放入服務器的根目錄是我們的最後一招,因此我們首先在探索其他選項。我決定另一種方式去使用HtmlPage.Window.Invoke()並使用JavaScript來調用Web服務,接收JSON數據,並將其返回到Silverlight環境,我將相應地解析它。我遇到了兩個問題:在Silverlight項目中調用異步JavaScript代碼

如果我同步調用它,我的UI線程凍結,直到調用完成,我不知道如何解決它。我的印象是UI線程是唯一可以訪問javascript的。

如果我異步調用它,我不知道如何不返回數據,直到readyState == 4。有任何想法嗎?

+0

是否有某種XML數據島替代JSON,可與IE7 +,Chrome,Firefox 3+和較新版本的Safari一起使用? – Sean

+0

如果您有任何其他問題或詳細信息可以添加到您的問題中,請編輯您的問題,而不是對其進行評論。 – AnthonyWJones

+0

你能澄清你的意思嗎?如何不返回數據? – Shad

回答

3

這裏是fundemental 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); 
} 

在Sliverlight的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. 
    })); 

} 
+0

如果您不想手動處理請求,則可以交替使用jQuery的ajax API來代替XmlHttpRequest。無論哪種方式,我同意在處理異步請求時使用一些回調方法是最好的方法。 –