2011-09-14 18 views
1

我做jQuery中下面的調用,使用JSONP作爲我的數據格式,我想直接做在Silverlight:

$.getJSON('https://api.wordstream.com/authentication/login?callback=?', 
    { 'username': un, 
     'password': pw 
}, function (loginResults) { 
    API_SESSION_ID = loginResults['data']['session_id']; 
    $.getJSON('https://api.wordstream.com/keywordtool/get_keywords?callback=?', 
     { 'session_id': API_SESSION_ID, 
      'seeds': keyword, 
      'max_results': 20 
    }, function (keywordResults) { 
     for (i = 0; i < +keywordResults['data'].length; i++) { 
      Keywords[i] = keywordResults['data'][i][0]; 
     } 
     return(Keywords); 
    }); 
}); 

我想這樣的事情辦理第一$ .getJSON(認證&回我的身份驗證令牌):

WebClient downloader = new WebClient(); 
WebRequest.RegisterPrefix("https://", System.Net.Browser.WebRequestCreator.ClientHttp); 
var client = new WebClient(); 
client.Credentials = new NetworkCredential("username", "password"); 
client.UseDefaultCredentials = false; 
client.DownloadStringCompleted += new  
DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
client.DownloadStringAsync(loginEndpoint); 

當我嘗試和運行此我得到我downloadstringcompleted事件處理程序中出現以下錯誤:

{System.Security.SecurityException: Security error. 
at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState) 
at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__1(Object sendState)} 

我以前通過.asmx文件在EF & SOAP服務中使用了WCF Ria服務,所以我對Web服務的想法並不陌生。我不確定是否需要使用clientaccesspolicy或跨域文件。

關於如何進行的任何想法?

感謝, 斯科特

+0

我只是希望你不發送'password'以純文本形式在網上... – balexandre

+0

注意使用RegisterPrefix爲https。所以不要明文。 –

+0

仍然應該首先編碼,而不是正常的text.Plus,在處理實現'IDisposable'接口的方法時總是使用'using()'。 – balexandre

回答

1

你試圖在這一系列的問題,做了什麼,現在變得更清楚給我。

除非api.wordstream.com包含一個ClientAccessPolicy xml(或Flash等價物),否則您將無法從Silverlight向此api發出請求。

你有兩個選擇:

  • 調入Javascript功能來使代表Silverlight應用程序的這些請求。
  • 在您的服務器上創建WCF服務以代表Silverlight應用程序發出這些請求。

我會推薦第一種方法,但不要使用getJSON。請使用JQuery中的標準ajax api異步獲取JSON內容。當最終的JSON內容可用時(仍以字符串形式)從Javasript傳入字符串中調用Silverlight。

最好是創建一個適當的.NET類和集合來匹配api中的數據。然後,您可以使用DataContractJsonSerialializer將收到的字符串反序列化爲您的類的實例。

有時創建一個類結構可能會有點負擔。另一種方法是使用以JsonValue.Parse開頭的System.Json名稱空間中的一組對象從字符串中加載JsonObjects集合。您現在可以在必要時使用這些子對象和Linq瀏覽返回的數據。

+0

我不認爲JavaScript可以獲取外部資源的字符串。但它可以執行它。所以如果你將json包裝在一些javascript中,你可以獲得外部的json資源。這是jsonp的重點。 – CodesInChaos

+0

感謝評論安東尼(你有沒有睡過?)。在最後一個問題中,當我從JS返回數據到Silverlight時,我試圖創建.NET類,但是我意識到包含我需要的實際數據的json只是:「Data:'[a,z], [b,y] ... [z,a]' - 數據本身不是屬性:值格式,它只是一個名爲數據的屬性和一個數組。 )並且失敗了我使用jObject&jArray來獲取從JS返回的數據 –

+0

要確認 - 你是說我的當前實現 - 從我的Silverlight VM調用JS,返回數據並使用jObject&jArray解析/ navigate/linqify,是正確的。只有修改將從$ .getJSON移動到$ .ajax? –

1

做了一點挖掘和測試。

當您調用外部域時,將出現跨域問題,這就是爲什麼您會看到Security error

請記住,這畢竟是一個Web應用程序,它在瀏覽器中運行!

要使Silverlight能夠到達其域外,請嘗試使用本文,如果您正在執行自我託管的應用程序。

http://blogs.msdn.com/b/carlosfigueira/archive/2008/03/07/enabling-cross-domain-calls-for-silverlight-apps-on-self-hosted-web-services.aspx

+0

是的,我在我的OP中提到了clientaccesspolicy/cross域。我腦海中的問題是,我不認爲這些文件在我的網站上是必需的。進一步挖掘之後,確實如此 - 它需要位於端點服務器上。 –