0

问题:

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

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

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

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

System.InvalidOperationException:保存更改时出错。有关详细信息,请参阅内部异常。---> System.Data.Services.Http.WebException:“HttpWebResponse.NormalizeResponseStatus”出现内部错误。在 System.Data.Services.Http.HttpWebResponse.NormalizeResponseStatus(Int32& statusCode) 在 System.Data.Services.Http.HttpWebResponse..ctor(HttpWebRequest request, Int32 statusCode, String responseHeaders) 在 System.Data.Services.Http.HttpWebRequest。 System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse(IAsyncResult asyncResult) 处 System.Data.Services.Http.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 处的 CreateResponse() --- 内部异常堆栈跟踪结束 --- 在 System. Data.Services.Client.BaseAsyncResult.EndExecute[T](对象源,字符串方法,IAsyncResult asyncResult) 在 System.Data.Services.Client.QueryAsyncResult.EndExecute[TElement](Object source, 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& statusCode) 在 System.Data.Services.Http.HttpWebResponse..ctor(HttpWebRequest 请求,

笔记:

从我读到的内容来看,对于 ADO.NET 数据服务,跨域访问似乎是被禁止的,这可能导致我不得不采取另一种数据访问方法,例如使用纯 REST 框架..?

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

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

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

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

问题:

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

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

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

谢谢。

4

2 回答 2

1

我不确定我是否完全了解您的问题,但至少,我会确保在service的根文件夹中有一个 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 应用程序中遇到了这个确切的问题,并且将这些文件放在适当的位置似乎可以解决问题。我将从这些文件开始,然后从那里开始。

于 2009-10-15T16:51:29.437 回答
0

“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,因为它不允许跨域调用。

于 2010-06-30T08:13:35.027 回答