来自Silverlight的WCF,不使用“添加服务引用”

时间:2010-12-09 16:20:17

标签: silverlight wcf

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接口)?

3 个答案:

答案 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中。