David Betz在他的文章中描述了如何在不使用“添加服务引用”选项的情况下创建对WCF的引用: http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2
创建WCF服务后,这些是silverlight中的语句:
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
EndpointAddress endpointAddress = new EndpointAddress("http://localhost:1003/Person.svc");
IPersonService personService = new ChannelFactory<IPersonService>(basicHttpBinding, endpointAddress).CreateChannel();
...
当我不使用“添加服务引用”来代理时,如何引用从Silverlight在WCF中创建的类型(例如IPersonService接口)?
答案 0 :(得分:2)
想法是引用在silverlight应用程序中包含WCF数据协定的程序集,为此你需要愚弄VS所以它认为程序集是SL程序集,他在这里详细描述
http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight
并且不那么容易,这是需要做的事情
只需使用相同的ILDasm / Edit / ILAsm 程序已经提到过了 装配使用合适的 Silverlight程序集代替了 .NET程序集。这是一个极端的 简单的程序,什么都没有 不仅仅是一个替代,一个程序 非常容易实现自动化 最小的努力。它不应该带你 很多时候写一个简单的 .NET应用程序为您执行此操作。 它只是一个简单的.NET Silverlight转换器和验证器 (测试不支持的组件 在Silverlight)。把那个申请 在你的Post Build Events中(其中一个 Visual的前5大功能 工作室!)你已经完成了。没特别 二进制十六进制值搜索必要 你所做的只是改变两个 记录的设置(公钥 令牌和版本)。
第二个解决方案是文件级解决方案,您对包含SL所需数据协定实现的文件使用添加链接选项,并确保它们仅包含允许构建SL的类型,并且不引用大量外部程序集,通常是WCF服务应该满足条件。数据合同。
我可以写更多,但它只是来自该链接的复制粘贴
答案 1 :(得分:0)
您还必须根据异步模式(BeginXXX / EndXXX)拆分IPersonService中的所有方法声明,因为Silverlight仅支持异步WCF(即使在后台线程中)。
作为帮助,您可以添加服务引用,然后从Reference.cs复制生成的IPersonService(所有方法将被解耦)。然后你可以删除引用。
但是,如果您的服务合同经常更改,您必须再次重复添加 - 服务程序,并从此开始,我会说,使用添加服务参考功能更容易,而不是与您共享合同应用服务器。
答案 2 :(得分:0)
我只想检测一件事。通常,您需要在WCF服务中具有更复杂的NET支持的名称空间中。因此,您必须具有真实原因才能引用WCF服务(或服务库)中的Silverlight子集。有很多方法可以 通过添加服务参考使用如此命名的传统方式。它们出现在文章enter link description here中。