我正在编写我的第一个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的)。
所以我的问题是:我如何处理这个问题?让我的项目使用本地服务会很好,当我部署时,它会使用远程服务。
我是否必须手动执行此操作或有自动方式?
感谢。
答案 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"