none
silverlight4 浏览器应用调用twitter API的问题 RRS feed

  • 问题

  • 请问,我有一个twitter 应用,是用Silverlight实现的,需要用webclient 调用twitter API,写法是这样的

     string MENTIONS_TIMELINE = "http://twitter.com/statuses/mentions.rss";

      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);

      WebClient twitter = new WebClient();

      twitter.Credentials = new NetworkCredential(UserName.Text, Password.Password);

      twitter.UseDefaultCredentials = false; // must be set to false if providing your own credentials

      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TwitterResultCompleted);

      twitter.DownloadStringAsync(new Uri(MENTIONS_TIMELINE));

    这样,如果该应用设置成"允许在浏览器外运行应用程序",上面的代码没有问题,能够正常访问twitter API,但如果不设置该选项,在浏览器里面运行,则不能访问twitter API,报"安全性错误",请高手解答,多谢

    2010年11月20日 14:46

答案

  • 你好,

    我查看了一下twitter.com的cross domian policy,内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    <cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
      <allow-access-from domain="twitter.com" />
     <allow-access-from domain="api.twitter.com" />
     <allow-access-from domain="search.twitter.com" />
     <allow-access-from domain="static.twitter.com" />
     <site-control permitted-cross-domain-policies="master-only"/>
      <allow-http-request-headers-from domain="*.twitter.com" headers="*" secure="true"/>
    </cross-domain-policy>

    即不允许twitter域之外的RIA程序来访问twitter.com,除非开启Silverlight OOB,并启用Elevated模式。

    没什么好的解决办法,你只能寻找twitter是否提供了同样功能的API.


    Mog Liang
    2010年11月22日 7:10

全部回复

  • 请问,我有一个twitter 应用,是用Silverlight实现的,需要用webclient 调用twitter API,写法实在这样的

     string MENTIONS_TIMELINE = "http://twitter.com/statuses/mentions.rss";

      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);

      WebClient twitter = new WebClient();

      twitter.Credentials = new NetworkCredential(UserName.Text, Password.Password);

      twitter.UseDefaultCredentials = false; // must be set to false if providing your own credentials

      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TwitterResultCompleted);

      twitter.DownloadStringAsync(new Uri(MENTIONS_TIMELINE));

    这样,如果该应用设置成"允许在浏览器外运行应用程序",上面的代码没有问题,能够正常访问twitter API,但如果不设置该选项,在浏览器里面运行,则不能访问twitter API,报"安全性错误",请高手解答,多谢

    2010年11月20日 14:35
  • 请问,我有一个twitter 应用,是用Silverlight实现的,需要用webclient 调用twitter API,写法是这样的

     string MENTIONS_TIMELINE = "http://twitter.com/statuses/mentions.rss";

      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);

      WebClient twitter = new WebClient();

      twitter.Credentials = new NetworkCredential(UserName.Text, Password.Password);

      twitter.UseDefaultCredentials = false; // must be set to false if providing your own credentials

      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TwitterResultCompleted);

      twitter.DownloadStringAsync(new Uri(MENTIONS_TIMELINE));

    这样,如果该应用设置成"允许在浏览器外运行应用程序",上面的代码没有问题,能够正常访问twitter API,但如果不设置该选项,在浏览器里面运行,则不能访问twitter API,报"安全性错误",请高手解答,多谢

     

    2010年11月20日 14:39

  • 请问,我有一个twitter 应用,是用Silverlight实现的,需要用webclient 调用twitter API,写法是这样的

     string MENTIONS_TIMELINE = "http://twitter.com/statuses/mentions.rss";

      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);

      WebClient twitter = new WebClient();

      twitter.Credentials = new NetworkCredential(UserName.Text, Password.Password);

      twitter.UseDefaultCredentials = false; // must be set to false if providing your own credentials

      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TwitterResultCompleted);

      twitter.DownloadStringAsync(new Uri(MENTIONS_TIMELINE));

    这样,如果该应用设置成"允许在浏览器外运行应用程序",上面的代码没有问题,能够正常访问twitter API,但如果不设置该选项,在浏览器里面运行,则不能访问twitter API,报"安全性错误",请高手解答,多谢

    2010年11月20日 14:42
  • 请问,我有一个twitter 应用,是用Silverlight实现的,需要用webclient 调用twitter API,写法是这样的

     string MENTIONS_TIMELINE = "http://twitter.com/statuses/mentions.rss";

      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);

      WebClient twitter = new WebClient();

      twitter.Credentials = new NetworkCredential(UserName.Text, Password.Password);

      twitter.UseDefaultCredentials = false; // must be set to false if providing your own credentials

      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TwitterResultCompleted);

      twitter.DownloadStringAsync(new Uri(MENTIONS_TIMELINE));

    这样,如果该应用设置成"允许在浏览器外运行应用程序",上面的代码没有问题,能够正常访问twitter API,但如果不设置该选项,在浏览器里面运行,则不能访问twitter API,报"安全性错误",请高手解答,多谢

    2010年11月20日 14:44
  • 请问,我有一个twitter 应用,是用Silverlight实现的,需要用webclient 调用twitter API,写法是这样的

     string MENTIONS_TIMELINE = "http://twitter.com/statuses/mentions.rss";

      WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);

      WebClient twitter = new WebClient();

      twitter.Credentials = new NetworkCredential(UserName.Text, Password.Password);

      twitter.UseDefaultCredentials = false; // must be set to false if providing your own credentials

      twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(TwitterResultCompleted);

      twitter.DownloadStringAsync(new Uri(MENTIONS_TIMELINE));

    这样,如果该应用设置成"允许在浏览器外运行应用程序",上面的代码没有问题,能够正常访问twitter API,但如果不设置该选项,在浏览器里面运行,则不能访问twitter API,报"安全性错误",请高手解答,多谢

    2010年11月20日 14:47
  • 我没办法运行你的例子,但猜想是由于OOB时SL在客户机的权限存储空间增加的原因。
    你随时可以开始!
    2010年11月20日 15:25
  • 這有可能和 Cross-site 有關係。
    在瀏覽器內執行會受到瀏覽器沙箱的安全模型阻擋 ...
    這個大概只有 Twitter 提出 Client Access Policy 檔案才有的解。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    目前籌建雲端運算學堂 (studyazure.com) 中...
    2010年11月21日 14:01
  • 你好,我在OOB模式下没有问题,但是在浏览器内运行就出现错误,我把源代码发到你邮箱了,请版主给看看

    2010年11月22日 5:39
  • 你好,

    我查看了一下twitter.com的cross domian policy,内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    <cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
      <allow-access-from domain="twitter.com" />
     <allow-access-from domain="api.twitter.com" />
     <allow-access-from domain="search.twitter.com" />
     <allow-access-from domain="static.twitter.com" />
     <site-control permitted-cross-domain-policies="master-only"/>
      <allow-http-request-headers-from domain="*.twitter.com" headers="*" secure="true"/>
    </cross-domain-policy>

    即不允许twitter域之外的RIA程序来访问twitter.com,除非开启Silverlight OOB,并启用Elevated模式。

    没什么好的解决办法,你只能寻找twitter是否提供了同样功能的API.


    Mog Liang
    2010年11月22日 7:10
  • 这是 Silverlight 自身对于跨站点访问的安全限制。您可以试图用一些其他的类型,如 HttpWebRequest 来代替 WebClient,试试看会不会出错;另外一种可以尝试的方法是利用 System.ServiceModel.Syndication 下的 SyndicationContent 试试。


    Mark Zhou
    2010年11月22日 8:12