在WCF中,服务器与客户端的通讯有单向(单工)和双向(双工)之分。要说有什么形式上的表现,那就是单向与双向生成的SOAP不同,咱们先放下代码不说。但通常情况下,我们也不太需要去研究生成的SOAP是啥样子 的,因为这些都是不需要我们动手的,我们也不必要精通它,没实际用途,你把SOAP玩透了,妹子也不会说你牛B的,我们只需知道某些概念的存在即可。

虽然单向与双向通讯没有UI,我们看不到,但我们有的是实验,为什么说学编程要常做实验,只有实验你才能获得书上学不到的知识。

WCF在实验阶段,为了方便,反正原理我们弄懂了就行,我基本上是使用最简单 的“控制台应用程序”,主要是方便。为了便于实验,而且我们知道,几乎每次实验,服务器端的代码几乎是一样的,所以,我建议各位在做研究实验的时候,不妨 做以下两项工作。

一、以管理员身份运行VS,因为运行服务器端需要管理员权限,如果没有以管理员身份运行,调试运行将失败。从VS的快捷方式属性窗口,切换到“兼容性”选项卡,勾选“以管理员身份运行”。

以后,只要你启动VS,就以管理员身份运行了。

二、建一个控制台应用程序,命名为WCFServerTemplate1,完成以下代码,然后保存为项目模板。

添加以下引用

接着输入以下代码:

namespace WCFServerTemplate1
{
class Program
{
static void Main(string[] args)
{
// 服务器基址
Uri baseAddress = new Uri("http://localhost:1378/services");
// 声明服务器主机
using (ServiceHost host = new ServiceHost(typeof(MyService), baseAddress))
{
// 添加绑定和终结点
WSHttpBinding binding = new WSHttpBinding();
host.AddServiceEndpoint(typeof(IService), binding, "/test");
// 添加服务描述
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
try
{
// 打开服务
host.Open();
Console.WriteLine("服务已启动。");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
}
}
namespace WCFServerTemplate1
{
[ServiceContract(Namespace = "MyNamespace")]
public interface IService
{
}
}
namespace WCFServerTemplate1
{
public class MyService : IService
{
}
}

依次单击【文件】-【导出模板】

随后弹出一个向导,选择“项目模板”,确认项目列表中选中的是你当前的项目名字。

然后继续,继续,直到完成即可。

保存模板后,以后在你新建项目时,就看到项目模板中有刚才导出的项目了。不过有一点很奇怪,导出时模板名字好像不能用中文。

以上方法仅备参考,有没有用你自己鉴定。

我们编写一个服务协定,如下:

    [ServiceContract(Namespace = "MyNamespace")]
public interface IService
{
[OperationContract(IsOneWay = true)]
void DoTestWork(string message);
}

将操作协定特性的IsOneWay设置为true,表明该操作是单向的,现在,我们实现这个接口。

    public class MyService : IService
{
public void DoTestWork(string message)
{
Console.WriteLine("从客户端发来的消息:" + message);
}
}

在解决方案中添加一个客户端项目,并且引用该服务。并测试调用。

        static void Main(string[] args)
{
WS.ServiceClient cl = new WS.ServiceClient();
cl.DoTestWork("尼玛!");
Console.ReadKey();
}

OK,调用成功。

下面我们回到服务器端代码,把服务协定和服务类改成这样:

    [ServiceContract(Namespace = "MyNamespace")]
public interface IService
{
[OperationContract(IsOneWay = true)]
DateTime DoTestWork(string message);
}
    public class MyService : IService
{
public DateTime DoTestWork(string message)
{
Console.WriteLine("从客户端发来的消息:" + message);
return DateTime.Now;
}
}

仍然是单向模式,但操作方法返回一个DateTime结构,重新生成一下服务器端,并更新客户端的引用,看看这回运行结果如何。

哈 哈,这回够精彩了吧!从错误信息我们得出了这么一个结论:

启用单向通讯的方法,不能有返回值(void可以),不能有out参数,只允许传入参数。

现在,我们把操作改为双向通讯,看看能不能执行。

    [ServiceContract(Namespace = "MyNamespace")]
public interface IService
{
[OperationContract(IsOneWay = false)]
DateTime DoTestWork(string message);
}

更新客户端引用,并修改调用代码。

        static void Main(string[] args)
{
WS.ServiceClient cl = new WS.ServiceClient();
DateTime dt = cl.DoTestWork("尼玛!");
Console.WriteLine("服务器回复时间:" + dt.ToString("yyyy年MM月dd日 HH时mm分ss秒"));
Console.ReadKey();
}

这回就成功了,既调用了服务,也得到了返回的数据。

从上面实验,我们看到:双向通讯是有问必有答的(哪怕方法返回void,客户端也会收到一条空消息)。

总结一句话——有来无往叫单向通讯,礼尚往来叫双向通讯

传说中的WCF(7):“单向”&“双向”的更多相关文章

  1. https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL_转

    转自:https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL 因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料, 这里做一个总结. 1. 首 ...

  2. mysql5.6数据库同步,单向双向同步问题

    windows下MySQL5.6实现主从数据库同步数据   mysql5.6数据库同步,单向双向同步问题 一.单向同步 主数据库(mysql5.6)192.168.1.104 从数据库(mysql5. ...

  3. HTTPS连接建立过程(单向&双向)

    HTTPS连接建立过程(单向&双向) 什么是https SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Securit ...

  4. 传说中的WCF(4):发送和接收SOAP头

    如果你实在不明白Header是个啥玩意儿,你就想一想你发送电子邮件时,是不是有个叫“附件”的东东?对啊,那么SOAP头是不是可以理解为一种附加信息?就是附加到消息正文的内容. 消息正文又是啥?WCF除 ...

  5. Tomcate配置单向双向SSL

    1.单向SSL 一.在Tomcate的service.xml文件中放开SSL配置 <!-- <Connector port="8443" protocol=" ...

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

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

  7. Hibernate 再接触 多对多单向双向关联

    情景:一个老师可能有多个学生,一个学生也可能有多个老师 多对一单向: 例如老师知道自己教哪些学生,学生却不知道自己被哪些老师教 方法:使用第三张表 分别存两张表的id annotation Stude ...

  8. linux下Tomcat+OpenSSL配置单向&双向认证(自制证书)

    背景 由于ios将在2017年1月1日起强制实施ATS安全策略,所有通讯必须使用https传输,本文只针对自制证书,但目前尚不确定自制证书是否能通过appstore审核. 1.必须支持传输层安全(TL ...

  9. SQL Server数据同步的研究(单向/双向)

    思路: 1.做中间件(简单:定时采集:复杂:分布式,订阅中心的形式,如微信的中间件:https://github.com/tencent-wechat/phxsql) 2.采用触发器的形式,有数据触发 ...

随机推荐

  1. hdu 1250 Hat's Fibonacci

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1250 Hat's Fibonacci Description A Fibonacci sequence ...

  2. 部分手机不能连PC adb

    http://www.th7.cn/Program/java/201407/232139.shtml 1. 命令行中执行 android update adb [这一步的目的是产生下面第二步的路径和文 ...

  3. [转]40多个关于人脸检测/识别的API、库和软件

    [转]40多个关于人脸检测/识别的API.库和软件 http://news.cnblogs.com/n/185616/ 英文原文:List of 40+ Face Detection / Recogn ...

  4. iOS 进阶 第十七天(0420)

    0420 凡是继承了UIResponder的类都可以做响应者 响应事件的传递是由底到高来传递,响应者链条是由高到底来响应 相应事件的传递(由底到高 找到正在和用户触摸交互的view) 准则:事件由父控 ...

  5. OC学习心得【适合初学者】

    一.类和对象 1.OC语言是C语言的扩充,并且OC是iOS和OS X操作系统的编程语言. ①具备完善的面向对象特性: 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内 继 ...

  6. Oracle EBS中查询Profile的各种SQL【转载】

    1.List E-Business Suite Profile Option Values For All Levels SELECT p.profile_option_name SHORT_NAME ...

  7. 最大后验估计(MAP)

    最大后验估计是根据经验数据获得对难以观察的量的点估计.与最大似然估计类似,但是最大的不同时,最大后验估计的融入了要估计量的先验分布在其中.故最大后验估计可以看做规则化的最大似然估计. 首先,我们回顾上 ...

  8. 20145103JAVA第一次实验报告

    20145103<Java程序设计>第一次实验报告 实验内容及其步骤 一.命令行下java程序开发 建立一个java文件,然后在命令行中,对程序进行javac编译,就生成了.class文件 ...

  9. linux入门基础_centos(二)--fdisk分区

    课时10 使用fdisk进行磁盘管理             fdisk是来自IBM的老牌分区工具,支持绝大多数的操作系统,几乎所有的linux的发行版本都装有fdisk,包括在linux的rescu ...

  10. SASS学习笔记_02

    导入 当模块化布局的时候 导入头和尾 私有化 不生成css文件 文件名前面加下划线   结果   嵌套导入   导入css文件 不推荐   注释 和默认变量值