代码之家  ›  专栏  ›  技术社区  ›  Dov

为什么我的twitter网络请求被炸飞了?

  •  0
  • Dov  · 技术社区  · 15 年前

    我一直在通过Tim Heuer的 Silverlight tuturial ,在其中设置一个基本界面来搜索Twitter。我昨天开始学习教程,完成了第3步。一切正常。但是,现在,我不能在openreadCompleted处理程序中不出现“system.security.securityexception”错误的情况下调用Twitter。这也适用于运行Heuer自己的代码。我假设这是一个跨域的访问问题,但Twitter的搜索API不应该是这样的。

    使用 Web Development Helper 我看到2次失败 http://search.twitter.com/clientaccesspolicy.xml ,然后成功读取 http://search.twitter.com/crossdomain.xml .这对我来说似乎很正常,因为第一个文件存在,而第二个文件不存在。我完全被卡住了,对Silverlight来说是个新手,不知道还能尝试什么。我很感谢你的帮助。

    Twitter呼叫如下:

    WebClient proxy = new WebClient();
    proxy.OpenReadCompleted += OnReadCompleted;
    proxy.OpenReadAsync(
        new Uri( @"http://search.twitter.com/search.atom?q=abc&since_id=0" ) );
    

    以下是错误详细信息:

    在System.NET.Browser.AsyncHelper.BeginOnui(sendorPostCallback BeginMethod,对象状态) 在system.net.browser.browserhttpwebrequest.endgetresponse(iasyncresult asyncResult)上 在System.NET.WebClient.GetWebResponse(WebRequest请求,IAsyncResult结果) 在System.NET.WebClient.OpenReadAsyncCallback上(IAsyncResult结果)

    1 回复  |  直到 15 年前
        1
  •  2
  •   Bryant    15 年前

    看来Twitter已经改变了他们搜索域上的客户端访问策略,不再允许来自其他域的请求。当前文件如下:

    <?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.com域,否则您无法访问它。

    更新 只是 read on twitter 他们又放宽了限制。新的crossdomain.xml更好:

    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
           <allow-access-from domain="*" />
    </cross-domain-policy>
    

    所以现在您的代码应该开始工作了。