更简单的解释如何在不添加服务参考的情况下进行呼叫WCF服务

1 silverlight wcf silverlight-2.0 silverlight-3.0

了解Silverlight 2中的WCF服务时,作者David Betz解释了如何在不在客户端应用程序中添加服务引用的情况下调用Web服务.我有几周的WCF经验,所以这篇文章是我的头脑.特别是,虽然作者给出了很多代码片段,但并没有说明会发生什么.在文章中,他为web.config文件提供了两个不同的代码片段,但没有说明发生了什么.

查看源代码,有四个项目和两个web.config文件.

到目前为止,我一直在使用Web服务的一个项目的标准Silverlight项目配置和Silverlight客户端的一个项目.

首先,本文中描述的过程是否适用于标准的两个项目配置?我认为会.

其次,有没有人知道一个更简单的例子?我对此很感兴趣,但是想要在创建新的Silverlight项目时生成默认的两个项目设置中的源代码,或者找到如何执行此操作的逐步描述(例如,添加一个类调用xxx.cs并添加此代码...,打开web.config并添加这些行......)

非常感谢Mike Thomas

Mat*_*vis 7

首先,一点点哲学......

如果您是未编写的WCF服务的使用者,则向客户端添加服务引用实际上是启用与该WCF服务交互的唯一机制.否则,您无法知道服务合同的外观,更不用说它的数据和消息合同了.

但是,如果您同时控制客户端和WCF服务本身,则向客户端添加服务引用是一个很好的方便,但我最近确信不会使用它.首先,在您更改合同的前几次记住更新服务参考之后,它会变得令人讨厌.在我的情况下,我有几个不同的C#项目正在使用WCF服务,所以我必须记住更新它们中的每一个.其次,创建服务引用会复制已在WCF服务中定义的合同定义.了解其含义非常重要.

假设您的WCF定义了以下类型.

[DataContract]
public class Person
{
    [DataMember] public string FirstName {get; set;}
    [DataMember] public string LastName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

向客户端添加服务引用时,将通过元数据交换(MEX)端点检索与此类关联的元数据,并在客户端"编译"的客户端上创建此类的精确副本.因此,您的WCF服务具有Person类的定义,您的客户端也是如此,但它们是两个不同的,不同的类定义.

鉴于此,将Person类抽象为一个单独的程序集然后在WCF服务和客户端之间共享会更有意义.额外的好处是,当您更改此共享程序集中的合同定义时,您不再需要更新客户端中的服务引用,因为它已经引用了共享程序集.那有意义吗?

现在回答你的问题.就个人而言,我只在C#项目中使用WCF,而不是Silverlight.但是,我不认为情况完全不同.鉴于此,我建议您在dnrTV 观看Extreme WCF视频.它提供了有关如何绕过服务引用功能的分步指南.

希望这可以帮助.