呼叫WCF服务,如何使无添加服务参考简单的解释(Simpler Explanation of How

2019-08-03 11:34发布

在了解WCF服务在Silverlight 2中 ,作者大卫·贝茨,说明如何调用Web服务而不增加在客户端应用程序的服务引用。 我有一对夫妇与WCF周的经验,所以文章是在我的头上。 特别是,虽然笔者介绍了大量的代码片段,但没有说什么去哪里。 在文章中,他提供了两种不同的代码片段的web.config文件,但没有说明是怎么回事。

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

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

首先,它在文章中描述的步骤与标准的两个项目配置工作? 我认为这将。

其次,没有人知道一个简单的例子吗? 我对此很感兴趣,但想要么在其中看到当一个新的Silverlight项目是由生成默认的二级项目设置的源代码,或者找一个一步如何做到这一步描述(例如,添加一个类所谓xxx.cs并添加以下代码...,打开web.config中添加以下代码行......)

非常感谢迈克·托马斯

Answer 1:

首先,小哲...

如果你是一个WCF服务,你没有写,添加服务引用到客户端的消费者真的是你必须启用与WCF服务交互的唯一机制。 否则,你无法知道服务合同是什么样子,更别说它的数据和消息的合同方式。

但是,如果你是在客户端和WCF服务本身两者的控制,增加了服务参考客户是一个很好的便利,但我最近一直坚信不使用它。 首先,它成为第几次当你改变了你的合同要记得更新你的服务引用滋扰。 而在我的情况,我有被消耗WCF服务的几个不同的C#项目,所以我一定要记得更新他们中的每一个。 其次, 创建服务引用复制了在WCF服务已经定义了合同的定义 。 明白这意味着什么是很重要的。

比方说,你WCF定义了下面的类型。

[DataContract]
public class Person
{
    [DataMember] public string FirstName {get; set;}
    [DataMember] public string LastName {get; set;}
}

当您添加服务引用到客户端,与此类相关的元数据通过元数据交换(MEX)终结点检索,并在客户端,你的客户“编译”对创建此类的翻版。 所以,你的WCF服务具有Person类的定义,所以确实你的客户端,但它们是两个不同的,不同的类定义。

鉴于此,它会更有意义,抽象的Person类到一个单独的组件,然后在WCF服务和客户端之间共享。 额外的好处是,当你改变这个共享组件内的合同定义,您不再需要更新客户端内的服务引用,因为它已经被引用的共享组件。 那有意义吗?

现在,你的问题。 就个人而言,我只C#项目,不是Silverlight的内部使用WCF。 不过,我不认为事情是完全不同的。 鉴于此,我建议你看极端WCF在dnrTV视频。 它给出了一个步骤一步指南如何绕过服务的参考特征。

希望这可以帮助。



Answer 2:

让我来试试 - 我不是在Silverlight开发的专家,所以忍耐一下,如果我说了一些并不适用于Silverlight的:-)

正如马特·戴维斯所说,“一切如常”的使用情况是这样的:你添加一个服务引用给定的服务URL。 在此过程中,Visual Studio中(或命令行工具svcutil.exe的)将询问该服务并抓住它的元数据 - 描述服务信息,所有可用的方法调用,参数是什么,他们希望等。从这个,它会为你生成一个类(通常被称为“客户端”或“客户端代理”),您的客户端(=服务消费者)将用于调用服务。 你可以有你的“正常”的Silverlight客户端项目中产生这个客户端代理类,或者你可能创建自己的“服务适配器”类库,ESP。 如果您将共享客户端代理代码其中包括几个Silverlight的项目。 事情是如何对事物的服务器端的结构是在这一点上完全不相干。

正如马特D.也提到,如果你做到这样,你的服务,它的方法,其数据的获取副本,在你的客户-那些在结构上有什么服务器有相同的-但他们同一类型 - 您在客户端有一个类型,该服务器具有另一个(字段和属性是相同的,虽然)。

所有连接的客户端(你)和服务器(另一端)的邮件及其结构- -叫什么方法和什么样的价值观传递到记住这一点,因为WCF的整个基本思想是信息传递是非常重要的该方法。 有没有其他链接 - 没有办法,一台服务器可以“连接”到客户端的代码,并检查什么或什么的。 所有这一切被交换的序列化消息(文本或二进制形式)。

如果你控制两端,可以简化事情有点 - 你可以上共享服务合同(定义的服务是什么样子和它有什么调入方法)正在和数据合同(什么数据的说明通过同时在服务器端和客户端来回)。 在这种情况下,你不会再增加一个服务引用,你会不会复制服务和数据定义,这样的事情是容易一点(但如果你在两端的控制是它仅适用)。

在这种情况下,最好的做法是打包了所有描述服务的服务器上到一个单独的组件(类库),然后你就可以复制到客户端(其方法和数据契约服务接口),和参考直接从那里(如任何旧的组件,你可能有)。 因此,在这种情况下,你通常会在你的解决方案至少有三个项目:

  • 您的实际Silverlight客户端项目
  • 网站或Web应用程序托管您测试Silverlight控件
  • 服务接口组件,其包含服务和数据契约

所以你有它 - 我希望我介绍这是怎么回事所有的基本知识,以及为什么你会想要做一个或其他的事情。 如果您需要更多的信息,不要犹豫,在这个帖子发表评论,让我们知道!



文章来源: Simpler Explanation of How to Make Call WCF Service without Adding Service Ref