WCF客户端和服务

?服务器端:

– 定义和实现服务契约

– 为服务类型构建ServiceHost实例,暴露endpoints

– 打开通讯通道

?客户端:

– 需要服务契约的一个副本和关于endpoints的信息

– 为特定的endpoint构建通信通道并且调用操作

客户端的客户进程中,有一个代理,该代理主要功能是完成客户进程和主机进程之间的通信。Proxy并不直接和主机的Endpoint通信,而是由客户端自己提供一个Endpoint和主机的Endpoint通信。

服务端有一个主机Host,提供服务,服务由Endpoint向外发布接口。

消息的通信由两端的Endpoint通信。

代码示例:

服务端代码

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

{

#region IHelloIndigoService Members

public string HelloIndigo(string message)

{

return string.Format("Receivied message at{0}:{1}", DateTime.Now, message);

}

#endregion

}

}

此处主要定义了服务契约。在WCF中,定义一个契约使用的是ServiceContract。只有定义了OperationContract的方法才会被放入服务中。

宿主程序

通常情况,服务宿主程序需要使用ServiceHost类,当使用IIS或者WAS作为宿主程序的时候IIS和WAS会自动创建ServiceHost类型。当自定义宿主服务的时候,需要手动创建ServiceHost对象。

namespace Host

{

class Program

{

static void Main(string[] args)

{

using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))//手动创建ServiceHost

{

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

host.Open();

Console.ReadLine();

}

}

}

}

客户端

客户端的契约要和服务端的保持一致

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:9009/HelloIndigo"));

string s = proxy.HelloIndigo("Hello from client...");

Console.WriteLine(s);

Console.ReadLine();

}

}

}

Endpoint

Endpoint实际上由ABC三个要素组成Address,Binding,Contract

使用配置文件实现服务和Endpoint

前面的方法是通过手工编程实现的,事实上,可以不用写代码而通过配置文件实现服务调用。

只使用代码而不用配置文件的情况不适合IIS为宿主的情况,IIS宿主必须使用配置文件配置WCF的ServiceHost。

主要步骤如下:

配置Host的配置文件如下:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<system.serviceModel>

<services>

<service name="HelloIndigo.HelloIndigoService" behaviorConfiguration="serviceBehavior">

<endpoint binding="basicHttpBinding" contract="HelloIndigo.IHelloIndigoService" address="HelloIndigo" />

<endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />

<host>

<baseAddresses>

<add baseAddress="http://localhost:8008"/>

</baseAddresses>

</host>

</service>

</services>

<behaviors>

<serviceBehaviors>

<behavior name="serviceBehavior">

<serviceMetadata httpGetEnabled="true" />

</behavior>

</serviceBehaviors>

</behaviors>

</system.serviceModel>

</configuration>

配置完毕后,宿主代码可以如下写法, 不再需要添加endpoint

static void Main(string[] args)

{

using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))//手动创建ServiceHost

{

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

host.Open();

Console.ReadLine();

}

}

为客户端添加Service Reference。对于客户端代码,可以不必要再写契约定义,因为添加完Service Reference之后,系统自动生成很多相关代码。按如下方法写即可。

添加完毕后可以适当修改app.config

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:9009/HelloIndigo"));

Client.ServiceReference1.HelloIndigoServiceClient proxy = new Client.ServiceReference1.HelloIndigoServiceClient();

string s = proxy.HelloIndigo("Hello from client...");

Console.WriteLine(s);

Console.ReadLine();

}

}

}

本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/572975,如需转载请自行联系原作者

WCF客户端和服务的实现的更多相关文章

  1. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  2. WCF系列教程之WCF客户端调用服务

    1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...

  3. WCF客户端获取服务端异常[自定义异常]

    引言 经过不断的摸索,询问/调试,终于学会了关于WCF客户端与服务端之间异常的处理机制,在此来记录自己的成果,用于记录与分享给需要的伙伴们. 首先感谢[.NET技术群]里群主[轩]的大力帮助,如有需要 ...

  4. WCF 客户端与服务端消息传输

    WCF很多需要认证信息,保证服务的安全,可以使用消息来实现 WCF 实现消息的方式: WCF中有两个接口: IClientMessageInspector [定义一个消息检查器对象,该对象可以添加到 ...

  5. WCF 客户端调用服务操作的两种方法

    本节的主要内容:1.通过代理类的方式调用服务操作.2.通过通道的方式调用服务操作.3.代码下载 一.通过代理类的方式调用服务操作(两种方式添加代理类) 1.手动编写代理类,如下: 客户端契约: usi ...

  6. WCF客户端与服务端通信简单入门教程

    服务端 1.新建空白解决方案,然后再空白解决方案中新建:WCF服务应用程序.建完后如图: 2.删掉自动生成的IService1.cs和Service.svc并添加WCF服务文件StudentServi ...

  7. WCF客户端和服务端配置

    服务端: <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samp ...

  8. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  9. WCF初探-13:WCF客户端为双工服务创建回调对象

    前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...

随机推荐

  1. ListView + ArrayAdapter + 接口回调

    众所周知,ListView是安卓最为频繁使用的控件,但是,随着人们审美观的提高,一些初级的ListView已经满足不了需求了,于是,我们必须为自己定制一套专属的ListView,这就需要用到适配器,A ...

  2. 2017蓝桥杯Excel地址(C++C组)

    题目:Excel地址Excel单元格的地址表示很有趣,它使用字母来表示列号.比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....当然Exce ...

  3. Array(数组)对象-->概念和创建

    1.什么是数组? 数组对象是使用单独的变量名来存储一系列的值. 2.数组创建的三种方法: 方法1:常规方式 var arr=new Array(); arr[0]="lisa"; ...

  4. C语言局部数组大小与内存的栈的关系

    今天有个同学问了一个问题,我居然答不上来,为什么不能开局部整型二维数组[1000][1000]?但是在数组前面加上一个static就可以了? windows下栈的大小(不是数据结构里面的栈)是2MB, ...

  5. Linux的文本编辑和文本内容查看命令

    Linux的文本编辑和文本内容查看命令 1.文本编辑命令 vi:用于编辑文本文件,基本上可以分为三种模式,分别是一般模式.编辑模式.命令行模式.    一般模式:当编辑一个文件时,刚进入文件就是一般模 ...

  6. SpringBoot项目中容易出现的问题

    SpringBoot项目的配置文件 另外启动文件的位置一定要在其它类的顶层,SpringBoot所在的main函数的同级包或子包在生效 开始做这个的时候最容易把配置文件搞错,造成sql查询异常

  7. AJ学IOS(21)UIApplication设置程序图标右上⾓红⾊数字_联⺴指⽰器等

    AJ分享,必须精品 效果简介 UIApplication的运用,有很多相如:进⾏行⼀一些应⽤用级别的操作等等,打开网页,打开电话拨号和信息等.. 什么是UIApplication ● UIApplic ...

  8. Salesforce Admin考题解析 | 流程自动化考题与知识点拓展

    [题目1] A record is modified on 1/1/2008. It meets criteria for a time-based workflow rule; this rule ...

  9. python做个谷歌内核浏览器

    源码: import sys,os os.chdir(os.path.dirname(os.path.abspath(__file__))) from PyQt5.QtGui import * fro ...

  10. 开始appium的第一个脚本

    设置DesiredCapabilities 存在于以下库中: org.openqa.selenium.remote.DesiredCapabilities Desired Capabilities告诉 ...