美元.等于Silverlight中的getJSON

本文关键字:getJSON 中的 Silverlight 等于 美元 | 更新日期: 2023-09-27 18:08:26

我正在使用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 eventandler中得到以下错误:

{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)}

我在EF &过去通过.asmx文件提供SOAP服务,所以我对web服务的概念并不完全陌生。我不确定是否需要使用clientaccesspolicy或跨域文件。

对如何进行有什么想法吗?

谢谢,斯科特

美元.等于Silverlight中的getJSON

你在这一系列问题中想要做什么,我现在明白了。

除非api.wordstream.com包含ClientAccessPolicy xml(或Flash等效),否则您将无法从Silverlight向该api发出请求。

你有两个选择:

  • 调用Javascript来代表Silverlight应用程序发出这些请求。
  • 在你的服务器上创建WCF服务,代表Silverlight应用程序发出这些请求。

我推荐第一种方法,但是不要使用getJSON。相反,使用JQuery中的标准ajax api来异步获取JSON内容。当最终的JSON内容可用时(仍然是字符串形式),从javascript调用Silverlight传入字符串。

最好是创建一组适当的。net类和集合来匹配来自api的数据。然后,您可以使用DataContractJsonSerialializer将接收到的字符串反序列化为类的实例。

有时创建类结构可能有点麻烦。另一种方法是从JsonValue.Parse开始,使用System.Json名称空间中的对象集从字符串加载JsonObjects集。现在,您可以在必要时使用这些`子对象和Linq来导航返回的数据。

我做了一些调查和测试。

当您调用外部域时,将发生跨域问题,这就是为什么您会看到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