wcf 实现多契约 z
我们知道,WCF服务端是先定义服务协定,其实就是一个接口,然后通过实现接口来定义服务类。那么,有一个问题,如果一个服务类同时实现N个接口(也就是有N个协定)呢?结果会如何?
不必猜,我们还是通过实验来说明吧。
首先,参照下面代码写好服务器端,代码中,我写了三个协定,然后一个服务类同时实现它们。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description; namespace Server
{
[ServiceContract]
public interface IService1
{
[OperationContract]
string SayHelloA();
} [ServiceContract]
public interface IService2
{
[OperationContract]
string SayHelloB();
} [ServiceContract]
public interface IService3
{
[OperationContract]
string SayHelloC();
} /// <summary>
/// 实现服务协定接口的服务类
/// </summary>
class MyService:IService1,IService2,IService3
{
static void Main(string[] args)
{
using (ServiceHost host=new ServiceHost(typeof(MyService),new Uri("http://localhost:8001/service")))
{
WSHttpBinding binding = new WSHttpBinding();
binding.Name = "MyBinding";
binding.Security.Mode = SecurityMode.None;
host.AddServiceEndpoint(typeof(IService1), binding, "mysv1");
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(behavior); host.Opened += (s, a) => Console.WriteLine("服务已启动。"); try
{
host.Open();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
host.Close();
}
} string IService1.SayHelloA()
{
return "你好,这是第一个服务协定。";
} string IService2.SayHelloB()
{
return "你好,这是第二个服务协定。";
} string IService3.SayHelloC()
{
return "你好,这是第三个服务协定。";
}
}
}
接着你试一下,在客户端引用服务,看看是什么样的?

神了,这是怎么回事呢?为什么客户端引用的服务中只有第一个协定?
还记得刚才的服务器端代码吗?请注意看我框起来的代码。

如果你上图中能找到原因,表明你悟性不错,呵呵。
注意我们添加终结点的时候,AddServiceEndpoint方法的第一个参数我们传了啥玩意儿进去了?是不是只有第一个服务协定的接口?
是啊,这上好理解了,
我们仅仅让服务类实现多个协定的接口是不够的,还要把希望对客户端公开的协定添加为终结点,对,一个协定一个终结点,不添加终结点的协定就不公开。
好了,现在找到原因了,代码知道怎么改了。
using (ServiceHost host=new ServiceHost(typeof(MyService),new Uri("http://localhost:8001/service")))
{
WSHttpBinding binding = new WSHttpBinding();
binding.Name = "MyBinding";
binding.Security.Mode = SecurityMode.None;
host.AddServiceEndpoint(typeof(IService1), binding, "mysv1");
host.AddServiceEndpoint(typeof(IService2), binding, "mysv2");
host.AddServiceEndpoint(typeof(IService3), binding, "mysv3");
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(behavior);
host.Opened += (s, a) => Console.WriteLine("服务已启动。");
try
{
host.Open();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
host.Close();
}
看看这回达到目的了没?

嘿,这回全有了。
不过,注意啊,在生成的客户端代理类中,是按协定来划分的,也就是说,我有三个协定,在客户端代码中就生成了三个客户端类。

所以,在客户端,我们应该这样调用。
class Program
{
static void Main(string[] args)
{
WS.Service1Client client1 = new WS.Service1Client();
Console.WriteLine(client1.SayHelloA()); WS.Service2Client client2 = new WS.Service2Client();
Console.WriteLine(client2.SayHelloB()); WS.Service3Client client3 = new WS.Service3Client();
Console.WriteLine(client3.SayHelloC()); Console.ReadKey();
}

wcf 实现多契约 z的更多相关文章
- WCF如何通过契约加编码方式调用
WCF采用基于契约的服务调用方法,通过System.ServiceModel.ChannelFactory<TChannel>直接创建服务代理对象. 创建服务代理 public stati ...
- [WCF编程]4.契约概述
一.契约的基本概念 契约是消息参与者之间的约定.在SOA架构中,契约提供了服务通信所必需的元数据.契约用来定义数据类型,操作,消息交换模式和消息交换使用的传输协议.契约通常是在标准化平台中使用与编程语 ...
- 重温WCF之数据契约中使用枚举(转载)(十一)
转载地址:http://www.zhuli8.com/wcf/EnumMember.html 枚举类型的定义总是支持序列化的.当我们定义一个新的枚举时,不必应用DataContract特性,就可以在数 ...
- 重温WCF之数据契约和序列化(四)
一.数据契约 1.使用数据协定可以灵活控制哪些成员应该被客户端识别. [DataContract] public class Employee { [DataMember] public string ...
- WCF之数据契约
从抽象层面看,WCF能够托管CLR类型(接口和类)并将它们公开为服务,也能够以本地CLR接口和类的方式使用服务.然而,CLR类型却属于.NET的特定技术.由于面向服务的一个核心原则就是在跨越服务边界时 ...
- WCF中数据契约之已知类型的几种公开方式
WCF中传输的数据不想传统的面向对象编程,它只传递了一些对象的属性,但是自身并不知道自己属于什么对象,所以,他没有子类和父类的概念,因而也就没有Is-a的关系,所以在WCF中,如果想维持这种继承关系, ...
- 通过 WCF 实现点对点文件共享 z
下载免费的项目源代码 下载项目的数据库 目录 简介 背景 为什么是WCF? WCF历史简述 WCF基础 点对点概念 代码分析(它是怎么工作的) 核心转化引擎层 下载管理层 服务层 代码的使用(如何运行 ...
- WCF 之 数据契约
前面几篇讲的都只能传递string类型的简单参数,数据契约就是用来解决如传递一个带有多个属性的Class类型的对象的. WCF推荐使用数据契约的方式实现数据的序列化.这部分的内容很好理解但是很重要,先 ...
- WCF学习笔记——契约不能少了set
我定义的WCF契约里,有一个类,里面的属性,有一个因为只读,所以只写了个get.结果客户端就报错. [DataContract] public class UserItem { public User ...
随机推荐
- Carryon 数数字
Carryon 数数字 描述 Carryon 最近迷上了数数字,然后 Starry 给了他一个区间[l,r] ,然后提了几个要求, 需要将 l 到 r 之间的数全部转化成 16 进制,然后连起来. 将 ...
- POJ - 3735 循环操作
构造n+1元组,m次方的矩阵代表循环操作 本题尚有质疑之处(清零操作的正确性还有单位矩阵的必要性),题解可能会改正 #include<iostream> #include<algor ...
- 前端 s 标签获取值
1. s标签获取action中的值: <s:property value="#parameters.mySessionPropKey"/> or <s:prop ...
- 从fis中得来的数据结构,Object版,
/* * config * caoke */ 'use strict'; //You can't use merge in util.js function merge(source, target) ...
- 字典树+map
Problem Description Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪.与此同时,他拿到了好多的字符串,可是看着很不顺 ...
- 【研究】缓慢的http拒绝服务攻击
1 详细描述: 缓慢的http拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量http request攻击,直到服务器带宽被打满,造成了拒绝服 ...
- PIE SDK专题制图打开模板
1. 功能简介 在PIE SDK中,所有的制图元素.视图范围以及排版等都可以保存成一个模板,以供多次重复使用.使用时只需要打开该模板,加载相应数据,就可以直接出图了,省去了重复制作图幅的麻烦,方 ...
- Java基础18-toString()方法、this关键字
1.toString()方法 在java中,所有对象都有toString()这个方法 创建类时没有定义toString方法输出对象时会输出哈希码值 它通常只是为了方便输出,比System.out.pr ...
- bootstrap日历插件地址
http://www.bootcss.com/p/bootstrap-datetimepicker/
- (转)python strip()函数 去空格\n\r\t函数的用法
原文:http://www.cnblogs.com/zdz8207/p/python_learn_note_20.html python3.4学习笔记(二十) python strip()函数 去空格 ...