如何部署启用Silverlight的WCF服务?

时间:2011-08-10 10:24:14

标签: silverlight deployment wcf-ria-services

我正在编写我的第一个Silverlight应用程序,它使用支持Silverlight的WCF服务来检索数据并将数据发送到我的服务器。

我创建了一个SL应用程序+ ASP.NET MVC网页来托管SL应用程序。

在MVC应用程序中,我创建了WCF服务,并在SL应用程序上使用它。到目前为止一切都很好。

我使用Web部署部署项目,它可以在我的远程主机上运行但是使用Fiddler我意识到远程应用程序正在使用我在开发服务器上的WCF服务(AKA localhost:port)。

我在VS中更改了WCF服务,它现在指向远程主机,如果我部署解决方案,到目前为止一直很好。

但是你知道,现在我的服务指向一个远程服务器并且不起作用,因为我必须为跨域访问创建xml(fiddler对我说是在domain.com/crossdomain.xml而不是domain的.com / virtualdirectory / crossdomain.xml的)。

所以我的问题是:我如何处理这个问题?让我的项目使用本地服务会很好,当我部署时,它会使用远程服务。

我是否必须手动执行此操作或有自动方式?

感谢。

2 个答案:

答案 0 :(得分:2)

端点地址包含在ServiceReferences.ClientConfig文件中,该文件是嵌入在XAP包中的文件的一部分。部署到实时服务器时,必须更新该文件。

解决方法是为客户端代理类构建工厂方法,该方法从Silverlight包的地址动态构建服务地址。 Here是一个指南,其中包含以下代码:

public class ServiceUtil {
    public static PeopleServiceClient GetPeopleServiceClient() {
        BasicHttpBinding binding = new BasicHttpBinding(
            Application.Current.Host.Source.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase) 
            ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.MaxBufferSize = int.MaxValue;
        return new PeopleServiceClient(binding, new EndpointAddress(
            new Uri(Application.Current.Host.Source, "../PeopleService.svc")));
    }
}

使用这样的工厂,您可以将应用程序部署到任何服务器而无需重新配置,只要silverlight XAP文件和服务的位置相对于彼此相同。

答案 1 :(得分:0)

您应该在服务器的根目录中添加clientaccesspolicy.xml文件。有关详细信息,请参阅此MSDN link。也可以使用crossdomain.xml,但是由于Flash,Microsoft将其放在那里,因为Silverlight仅支持crossdomain.xml的子集,所以首选clientaccesspolicy.xml。

在部署之前,最好使用localhost服务。部署时,您可以更改配置文件或编写代码以动态查找服务URL。此示例假定该服务与Silverlight XAP在同一URL中。

string serviceUrl = Application.Current.Host.Source.AbsoluteUri.Substring(0, Application.Current.Host.Source.AbsoluteUri.IndexOf("ClientBin/")) + "Services/DataService.svc"