您的位置:首页 > 其它

一步一个脚印学习WCF之一WCF概要(中)之客户端与服务-WCF服务的创建与调用Demo

2011-11-02 18:51 716 查看
演示实例 WCF的创建和调用
大家看到三个工程图一,分别对应图二里面的不同部分,Client对应图二里面的ClientApp,HelloIndigo对应了图二里面的Service,也就是说具体的服务是由HelloIndigo来进行提供的,Host对应图二里面的ServiceHost,为HelloIndigo来提供一个运行的环境。



图一                          



图二

  下面咱们来看具体的工程里面的代码
  第一个工程:HelloIndigo
文件:HelloIndigoService.cs
  


  为了能够使用WCF,在引用里面需要添加System.ServiceModel和System.IdentityModel。
  using System;

  using System.ServiceModel;
  namespace HelloIndigo

  {

  [ServiceContract(Namespace="http://www.monkeyfu.net/")]

    //接口

  public interface IHelloIndigoService

  {

   [OperationContract]

   string HelloIndigo(string message);

  }

    //来实现这个接口的一个具体类 对于加了契约的接口来进行实现

  public class HelloIndigoService : IHelloIndigoService

  {

public string HelloIndigo(string message)

   {

   return string.Format("消息 收到了 在 {0}:{1}", DateTime.Now, message);

   }

}

  }

在接口中实际上是定义了我们这个服务它要完成哪些事情,在这个接口中它要完成HelloIndigo这个操作并且需要一个message的参数以及一个字符串类型的返回值,大家看到在接口上面多了一些属性ServiceContract和OperationContract,这些属性是在WCF当中特有的一些标记,这些标记我们把它称之为契约,这个实际上是WCF一个非常显著的特点,在WCF当中就是说客户端与服务端进行通信必须要遵循某个契约来完成,客户端和服务端保证这些契约必须是相吻合的。
  第二个工程:Host
文件:Program.cs
  


  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.ServiceModel;

  using System.ServiceModel.Dispatcher;

  namespace Host

  {

  class Program

  {

  static void Main(string[] args)

  {

  using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))

  {

  host.AddServiceEndpoint(typeof(HelloIndigo.IHelloIndigoService), new NetTcpBinding(), "net.tcp://localhost:9000/HelloIndigo");

  host.Open();

  Console.ReadLine();

  }

  }

  }

  }

  在Main这个主函数里面,我们创建一个ServiceHost host = new ServiceHost(),也就是创建一个主机,并且这个host所对应的服务实例是HelloIndigo.HelloIndigoService也就是第一个工程里面的实现那个类,ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService))这句代码的意思就是说我们启动了一个新的主机,这个主机里面现在运行着一个服务,这个服务是由HelloIndigo.HelloIndigoService这个类来进行实现的。然后在创建完一个host我们需要添加一个新的Endpoint,之前我们说过Endpoint又叫端点,它的主要作用是实现客户端和服务端之间的通信,在我们添加一个新的Endpoint需要指定一些参数,第一个参数是这个Endpoint绑定到了哪个接口上,在这里是绑定到了IHelloIndigoService这个接口上面,也就是说所有经过这个Endpoint的消息它都是遵循这个接口的,也就意味着所有通过我们添加的这个Endpoint的消息必须都要满足IHelloIndigoService接口里面相应的契约当中的要求,第二个参数还要指定我们的这个Endpoint传输消息的时候需要绑定在哪个协议上面,在这里是使用new
NetTcpBinding(), 就是使用TCP的协议来进行消息的传递,在指定完协议绑定完以后,第三个参数是要指定我们在进行消息传递的时候,通信的具体地址是哪里,在这里是net.tcp://localhost:9000/HelloIndigo。然后host.Open();是打开主机,当host打开后可以对来提供服务,客户端也可以连到主机上面来使用主机上面提供的这个HelloIndigoService的这个服务了。

  第三个工程:Client

文件:Program.cs
  


  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.ServiceModel;

  namespace Client

  {

  [ServiceContract(Namespace = "http://www.monkeyfu.net/")]

  public interface IHelloIndigoService

  {

   [OperationContract]

  string HelloIndigo(string message);

   }

  class Program

  {

  static void Main(string[] args)

  {

  IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:9000/HelloIndigo"));

   //localhost.HelloIndigoServiceClient proxy = new Client.localhost.HelloIndigoServiceClient();

   string s = proxy.HelloIndigo("我是从客户端来的一个消息");

  Console.WriteLine(s);

  Console.ReadLine();

  }

  }

  }

   前面讲到Client它想要与Service进行交互的话需要一个proxy,因此我们首先需要创建一个proxy,我们使用ChannelFactory通道厂类创建一个新的channel通道出来,ChannelFactory它本身是一个泛型,在这个泛型指明这个proxy遵循了哪一个契约,在这里我们使用了IHelloIndigoService这个契约,这个契约的描述我们定义在了class Program的上面,大家可以看到这个描述和我们定义在HelloIndigoService.cs里面的IHelloIndigoService描述是一摸一样的,客户端要想使用这个服务的话呢,必须使用和这个服务相匹配的契约来进行访问,这个是必须要遵守的要求。CreateChannel(new
NetTcpBinding(), new EndpointAddress("net.tcp://localhost:9000/HelloIndigo"))在CreateChannel方法里面来指定一些通信相关的参数,第一个参数也是绑定在Tcp上面的通信方法,第二个参数是创建一个新的EndpointAddress,并且它的地址是指向ServiceHost的地址。大家会看到当我们创建完proxy以后呢,实际上是把我们的Client端和Host端建立的一个等价的联系,也就是我们大家都是使用Tcp协议,来访问Host提供的地址net.tcp://localhost:9000/HelloIndigo,并且使用相同的契约。在创建完proxy以后呢,我们就可以调用proxy里面的HelloIndigo这个方法了,这个HelloIndigo就是前面的HelloIndigoService.cs里面的IHelloIndigoService接口提供的方法,在执行HelloIndigo的这个方法时候,WCF会通过会通过Tcp协议来访问Host里面的net.tcp://localhost:9000/HelloIndigo这个地址,在Host端的Endpoint会接收到

这个消息以后会根据契约IHelloIndigoService找到HelloIndigoService类里面相应的业务逻辑,并且执行逻辑里面实际的代码。对于客户端这些底层我们不需要去关心的我们只需要调用HelloIndigo这个方法就行了,跟我们本地调用是没什么区别的。

  运行时效果 Client端通过Tcp协议去访问了Host端里面的HelloIndigoService服务里面的HelloIndigo这个方法, 这样我们就完成了一个简单的基于Tcp协议的分布式的调用。

  1:首先启动Host端 右黑框

  2:再启动Client端 左黑框

  


总结

客户端和服务端的基本要求

.服务端

1:定义和实现服务契约。也就是说在服务这一端的话,它不但要完成具体服务的业务逻辑,还要完成这个服务相应的契约。

2:为服务类型创建ServiceHost实例,暴露Endpoints。创建ServiceHost实例可以理解为我们创建了一个服务器,并且把这个服务放到服务器里来进行处理,同时要暴露出Endpoints端点来,使得客户端能够来访问ServiceHost里面对应的Service服务。

3:打开通信的通道。使得客户端能够访问服务端的这些服务。

.客户端

1:需要服务契约的一个副本和关于Endpoints端点的信息。服务契约的一个副本可以理解为在这个服务当中包含契约的一个接口,虽然说客户端不需要服务的具体的业务逻辑,但是客户端需要这个服务当中包含契约的一个接口,来告诉客户端它如何与服务端进行通信,Endpoints端点的信息主要包含了服务器端服务的具体地址以及使用什么样的协议进行具体的通信。

2:为特定的Endpoints构建通信通道并且执行调用操作已完成我们具体的服务。

下面这个图三更好的说明了客户端和服务端具体的Endpoints的一个作用。我们就已ABC来进行一下阐述,A表示Address地址,这个主机在哪,像上面提到的”net.tcp://localhost:9000/HelloIndigo“,这个就是我们所说的地址,它告诉客户端要去哪里访问主机当中的服务。B表示Binding绑定,Binding告诉我们如何来进行通信,像上面提到的我们使用的Tcp的协议来进行通信。C表示Contract契约,Contract告诉我们究竟要传什么,要干什么,还对我们要干什么的操作进行了具体的约束我们做这件事情的名称和参数都是用Contract契约来描述的。一个消息要想传送出去或者想要接收到的话必须要有ABC这三样东西的,这三样是缺一不可的。



图三
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐