Silverlight中的$ .getJSON等价物

时间:2011-09-14 08:04:24

标签: c# jquery silverlight web-services

我正在使用jsonp作为我的数据格式在jQuery中进行以下调用,我想直接在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)}

我在EF&amp ;;中使用了WCF Ria服务。过去通过.asmx文件提供SOAP服务,所以我对Web服务的概念并不陌生。我不确定是否需要使用clientaccesspolicy或crossdomain文件。

关于如何进行的任何想法?

谢谢, 斯科特

2 个答案:

答案 0 :(得分:1)

现在,你在这一系列问题中想要做的事情已经变得更加清晰了。

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

您有两种选择:

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

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

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

有时创建类结构可能会有点负担。另一种方法是使用System.Json命名空间中以JsonValue.Parse开头的对象集来从字符串中加载JsonObjects集。现在,您可以使用这些`son对象和Linq在必要时浏览返回的数据。

答案 1 :(得分: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