【问题标题】:Self Hosted ADO.NET Data Services, comsuming from an external Silverlight application自托管 ADO.NET 数据服务,来自外部 Silverlight 应用程序
【发布时间】:2010-06-30 16:19:08
【问题描述】:

问题:

存在一个问题,我无法从我的 RIA 应用程序访问我的自托管 ADO.NET 数据服务。

我的服务与富 Internet 应用程序 (RIA) 的 Web 项目分开托管。

我需要启用来自单独 Silverlight(和 Flash)客户端应用程序的访问。

当我尝试调用 ADO.NET 数据服务(单独自托管)时,在 Silverlight 中出现异常(见下文)。我相信这是由于 Silverlight 禁止跨域调用。

System.InvalidOperationException:保存更改时出错。有关详细信息,请参阅内部异常。 ---> System.Data.Services.Http.WebException:“HttpWebResponse.NormalizeResponseStatus”出现内部错误。 在 System.Data.Services.Http.HttpWebResponse.NormalizeResponseStatus(Int32& 状态码) 在 System.Data.Services.Http.HttpWebResponse..ctor(HttpWebRequest 请求,Int32 状态码,字符串 responseHeaders) 在 System.Data.Services.Http.HttpWebRequest.CreateResponse() 在 System.Data.Services.Http.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse(IAsyncResult asyncResult) --- 内部异常堆栈跟踪结束 --- 在 System.Data.Services.Client.BaseAsyncResult.EndExecute[T](对象源,字符串方法,IAsyncResult asyncResult) 在 System.Data.Services.Client.QueryAsyncResult.EndExecute[TElement](对象源,IAsyncResult asyncResult) 在 System.Data.Services.Client.DataServiceQuery`1.EndExecute(IAsyncResult asyncResult) 在 Curo.Silverlight.MainPage.c__DisplayClass1.<.ctor>b__0(IAsyncResult ar) 在 System.Data.Services.Client.BaseAsyncResult.HandleCompleted() 在 System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse(IAsyncResult asyncResult) 在 System.Data.Services.Http.HttpWebRequest.ReadyStateChanged() System.Data.Services.Http.WebException:“HttpWebResponse.NormalizeResponseStatus”出现内部错误。 在 System.Data.Services.Http.HttpWebResponse.NormalizeResponseStatus(Int32& 状态码) 在 System.Data.Services.Http.HttpWebResponse..ctor(HttpWebRequest 请求,Int32 状态码,字符串 responseHeaders) 在 System.Data.Services.Http.HttpWebRequest.CreateResponse() 在 System.Data.Services.Http.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse(IAsyncResult asyncResult)

注意事项:

根据我的阅读,ADO.NET 数据服务似乎禁止跨域访问,这可能导致我不得不对数据访问采取另一种方法,例如使用纯 REST 框架..?

“跨域ADO.NET的问题 数据服务比它更复杂 听起来,它还没有解决。 我已经和微软讨论过 而现在和它的原因 不起作用与其使用有关 浏览器级别的传输和 运输不允许跨站点 脚本。”

见: http://forums.silverlight.net/forums/p/70925/170703.aspx#170703

我了解我可能需要公开一个 ClientAccessPolicy.xml 文件,该文件将定义访问规则,同时限制跨站点脚本。

值得一提的是,RIA 应用程序将在同一个 LAN 上运行。

问题:

考虑到我的 RIA 客户端将在同一防火墙后运行,我是否有可行的方法来访问这些服务?如果有怎么办?

如何准确地从自托管 ADO.NET 数据服务公开 ClientAccessPolicy.xml?

为了允许外部访问我的服务,您建议采用哪种方式? - 不同的 REST 框架? - 以分离为代价在同一个 Web 项目中托管服务? - 任何其他建议...

谢谢。

【问题讨论】:

    标签: silverlight client-server wcf-data-services


    【解决方案1】:

    我不确定我是否完全理解您的问题,但至少,我会确保在 服务的根文件夹中有一个 clientaccesspolicy.xml 文件和一个 crossdomain.xml 文件。 xml 策略文件位于域的根文件夹中很重要。例如,如果您的服务托管在 mycompany.com/services 中,则 xml 文件需要位于 mycompany.com 文件夹中,而不是 services 文件夹中。

    这是 ClientAccessPolicy.xml 的示例:

    <?xml version="1.0" encoding="utf-8" ?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from http-request-headers="*">
            <domain uri="*"/>
          </allow-from>
          <grant-to>
            <resource include-subpaths="true" path="/"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>
    

    下面是 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-http-request-headers-from domain="*" headers="*" />
    </cross-domain-policy>
    

    我建议将这两个文件同时用于 flash 和 silverlight。以上两个文件都将允许从所有 flash 和 silverlight 应用程序进行开放访问,但如果您位于防火墙后面,这应该不是问题。

    我在我的一个防火墙后的 silverlight 应用程序中遇到了这个确切的问题,将这些文件放在适当的位置似乎可以解决问题。我将从这些文件开始,然后从那里开始。

    【讨论】:

    • 如何准确地从自托管 ADO.NET 数据服务公开 ClientAccessPolicy.xml?
    • 对不起,我错过了您的回复。创建一个名为 ClientAccessPolicy.xml 的文件,就像我上面概述的那样。如果您愿意,可以从上面复制粘贴。您需要转到托管服务的根文件夹。例如,如果您的服务托管在 myPC.myCompany.com/Services/myservice,您需要将 XML 文件放到 myPC.myCompany.com 的文件夹中。这就是 silverlight 查找文件的地方。
    • 但是,通过阅读您上面的帖子,它可能仍然比这更复杂。在这一点上我知道要做的就是告诉你将 XML 文件放在哪里。
    • 感谢您回复我。我通过 [WebGet] 服务调用公开了策略文件,因为数据服务是自托管的。似乎没有办法公开 ADO.NET DataServices Cross Domain。
    【解决方案2】:

    “Cross Domain ADO.NET Data Services 的问题比听起来更复杂,一直没有解决。我已经和微软讨论了一段时间,它不起作用的原因必须使用浏览器级别的传输来处理它,并且该传输不允许跨站点脚本。”

    见:http://forums.silverlight.net/forums/p/70925/170703.aspx#170703

    跨域策略是必需的(如上面 Ben McCormack 的回答所示)。

    通过使用设置为允许跨域访问聚合提要的 Yahoo 管道,您可以从 Silverlight 应用程序中使用和外部 ADO.NET 数据服务(以前的 Astoria,现在的 OData)。

    您很可能会失去查询 Odata 提供给您的数据集的保真度,但这可以在 yahoo 管道中重新创建。

    问题不在于 ADO.NET 数据服务 (OData),而在于 Silverlight,因为它不允许跨域调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多