美元.等于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或跨域文件。
对如何进行有什么想法吗?
谢谢,斯科特
你在这一系列问题中想要做什么,我现在明白了。
除非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