从 Silverlight 访问 Rally SOAP 服务
Posted
技术标签:
【中文标题】从 Silverlight 访问 Rally SOAP 服务【英文标题】:Accessing Rally SOAP service from Silverlight 【发布时间】:2012-04-26 17:29:38 【问题描述】:是否可以从 Silverlight 访问 Rally 的 SOAP 服务?我能够从桌面应用程序中的 .NET 2.0 代理访问该服务,但不能通过 Silverlight 中的 WCF 客户端代理。我得到以下熟悉的异常,
System.ServiceModel.CommunicationException: 时发生错误 尝试向 URI 发出请求 .... 这可能是由于尝试 以跨域方式访问服务而没有适当的 跨域策略,或不适合 SOAP 的策略 服务。您可能需要联系服务的所有者来发布 跨域策略文件并确保它允许与 SOAP 相关的 HTTP 要发送的标头。此错误也可能是由于使用内部 键入 Web 服务代理而不使用 InternalsVisibleToAttribute 属性。请查看内部异常 了解更多详情。
我认为问题是由于尝试从 Silverlight 发出跨域请求引起的,这需要在服务器上安装跨域策略文件。如果是这样,为什么桌面应用不需要这样的策略?
【问题讨论】:
【参考方案1】:我不是 Silverlight 专家,但这看起来像是 Silverlight 实施的跨域脚本/安全沙箱,以确保 Silverlight 客户端不会向下载它们的服务器/主机以外的站点发出请求,除非服务提供商/开发者明确授予 Silverlight 客户端该权利。在上面的错误信息中:
“您可能需要联系服务的所有者以发布跨域策略文件并确保它允许发送与 SOAP 相关的 HTTP 标头。”
我认为“服务所有者”是指 Silverlight 主机的所有者,而不是“外部”网络服务(在本例中为 Rally)。
桌面和/或控制台应用程序不会有同样的沙盒限制。尝试通过 Silverlight 客户端访问其他供应商的 Web 服务时,您可能会遇到同样的问题。
您可能会发现此 Silverlight 特定主题:
Cross Domain Policy
有助于详细了解如何在您的服务器上设置和配置 Silverlight 跨域策略文件。
【讨论】:
【参考方案2】:Silverlight 的构建考虑了安全性。这意味着默认情况下,Silverlight 应用程序中的跨站点脚本是关闭的,并且必须根据具体情况启用。另一方面,.NET 桌面应用程序通常具有更高的安全权限,并且可以调用它喜欢的任何 Web 服务、COM 对象和本机 API。
在 Silverlight 中解决此问题的方法是在您的服务器上创建服务。 Silverlight 客户端代码调用您的服务器端服务,该服务又调用第三方 Web 服务。服务器端服务可以押注 .NET、java 等等。 Web 服务器通常可以调用它们喜欢的任何东西——问题解决了。
【讨论】:
感谢您的回复。我考虑过这种方法,但设法通过提高对 Silverlight 5 的信任来解决它。 是的,这是解决问题的另一种方法:在您的应用程序中爆炸一堆权限。 :) 如果您不需要在浏览器中运行,那么从浏览器应用程序中提升信任可能会更容易。不同之处在于浏览器内提升信任的东西看起来你必须签署你的应用程序才能正常工作。哪个更容易取决于您的情况和组织。【参考方案3】:通过使用 Silverlight 5 中提供的扩展权限功能我自己解决了这个问题。由于 xap 部署在内部 Internet 上,因此该解决方案是可以接受的。
【讨论】:
以上是关于从 Silverlight 访问 Rally SOAP 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?
做题agc002D - Stamp Rally——整体二分的技巧