我们知道,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(3):多个协定的更多相关文章

  1. 传说中的WCF(8):玩转消息协定

    Message翻译成中文,相信各位不陌生,是啊,就是消息,在WCF中也有消息这玩意儿,不知道你怎么去理解它.反正俺的理解,就像我们互发短信一个道理,通讯的双方就是服务器与客户端,说白了吧,就是二者之间 ...

  2. 传说中的WCF(5):数据协定(a)

    在第4篇中,咱们了解了发送/接收SOAP头,从本篇开头,我们不妨更深入地去探求一下有关WCF中的消息到底是啥玩意儿.WCF庞大而复杂,而从 MSDN文档中,你会看到许多很专业很抽象的东西,你不禁会问, ...

  3. 传说中的WCF(2):服务协定的那些事儿

    上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...

  4. [转] 传说中的WCF(2):服务协定的那些事儿

    上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...

  5. 传说中的WCF(6):数据协定(b)

    我们继续,上一回我们了解了数据协定的一部分内容,今天我们接着来做实验.好的,实验之前先说一句:实验有风险,写代码须谨慎. 实验开始!现在,我们定义两个带数据协定的类——Student和AddrInfo ...

  6. 传说中的WCF(12):服务器回调有啥用

    你说,服务器端回调有啥用呢?这样问,估计不好回答,是吧.不急,先讨论一个情景. 假设现有服务器端S,客户端A开始连接S并调用相关操作,其中有一个操作,在功能上有些特殊,调用后无法即时回复,因为在服务器 ...

  7. 传说中的WCF(11):会话(Session)

    在标题中我加了一个大家都很熟悉的单词——Session,熟吧?玩过Web开发的朋友肯定在梦中都会见到她. 在Web中为什么要会话呢?毕竟每个用户在一个Web应用中可能不止进行一次操作,比如,某二手飞机 ...

  8. 传说中的WCF(10):消息拦截与篡改

    我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过 程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过 ...

  9. 传说中的WCF(9):流与文件传输

    在使用Socket/TCP来传输文件,弄起来不仅会有些复杂,而且较经典的“粘包”问题有时候会让人火冒七丈.如果你不喜欢用Socket来传文件,不妨试试WCF,WCF的流模式传输还是相当强大和相当实用的 ...

随机推荐

  1. .net 的生成操作

    生成操作(BuildAction) 属性:BuildAction 属性指示 Visual Studio .NET 在执行生成时对文件执行的操作. BuildAction 可以具有以下几个值之一: 无( ...

  2. Knockout应用开发指南 第一章:入门

    2011-11-21 14:20 by 汤姆大叔, 20165 阅读, 17 评论, 收藏,  编辑 1    Knockout简介 (Introduction) Knockout是一个轻量级的UI类 ...

  3. JavaScript AJAX stream 流式显示

      当使用AJAX进行信息交互的时候,如果服务器返回的信息比较大,那么相对于传送完成之后的统一显示,流式显示就比较友好了. 流式实现 原理就是设置定时器,定时的查看AJAX对象的状态并更新内容,如果传 ...

  4. UIImagePickerController之Block回调

    方法使用:引入头文件 #import "UIImagePickerController+Block.h" 我这拖出来的两个属性 @property (weak, nonatomic ...

  5. editplus文本编辑器

    EditPlus中文破解版是一款功能强大的文本编辑器,拥有无限制的撤消与重做.英文拼字检查.自动换行.列数标记.搜寻取代.同时编辑多文件.全屏幕浏览功能.还有一个好用的功能,就是它有监视剪贴板的功能, ...

  6. Mono for Android (1) 之布局

    最近和同事交接工作,首次接触mono for android, 结果画view时少了layout,页面没办法出来,各种冥思,各种找问题,最后把关于布局的一些共享出来(同事写的,哈哈):   Andro ...

  7. C++ vector介绍

    <span style="font-family: Arial; ">在此总结一下模板vector的使用介绍</span> 标准库vector类型使用需要的 ...

  8. springboot常见应用属性

    # ===================================================================# COMMON SPRING BOOT PROPERTIES ...

  9. 教你怎么把安卓应用软件放到系统根目录system/app下

    安卓手机有时候安装的软件多了,用着久了就会出现卡机,死机的现象,流畅度大大的减弱了,实在是影响使用体验.对于这种情况,有的人会经常清理后台程序,可是次数多了,提速的效果也不太明显.那么,到底怎么做才能 ...

  10. nginx简单反向代理和负载均衡(ubuntu)

    nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机    均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.13 ...