十五天精通WCF——第一天 三种Binding让你KO80%的业务

简介:

  转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了,

再简单的话马路上的大妈也能写wcf了,好了,wcf最基本的概念我们放在后面慢慢分析,下面我们来看看神奇的3个binding如何KO我们实际场景中的80%的业务场景。

一:basicHttpBinding

  作为入门第一篇,也就不深入谈谈basic中的信道栈中那些啥东西了,你只需要知道有ABC三个要素,注意不是姨妈巾哦,如果需要详细了解,可以观赏我以前的系列。在

这里我就不多说了,太简单的东西没意思,先看个例子简单感受了,你只需知道的是basic走的是http协议就好了,传输消息为soap。

1. 契约

using System.Runtime.Serialization;
using System.ServiceModel;

namespace MyService
{
 [ServiceContract]
 public interface IHomeService
 {
 [OperationContract]
 int GetLength(string name);
 }
}

2. 实现类
using System;
using System.Messaging;
using System.Threading;

namespace MyService
{
 public class HomeService : IHomeService
 {
 public int GetLength(string name)
 {
 return name.Length;
 }
 }
}

3. 服务启动
using System;
using System.ServiceModel;

namespace MyService
{
 class Program
 {
 static void Main(string[] args)
 {
 using (ServiceHost host = new ServiceHost(typeof(HomeService)))
 {
 try
 {
 host.Open();

 Console.WriteLine("服务开启!");

 Console.Read();
 }
 catch (Exception e)
 {
 Console.WriteLine(e.Message);
 }
 }
 }
 }
}

4. 配置config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
 <bindings>
 <netTcpBinding>
 <binding name="IHomeServiceBinding" />
 </netTcpBinding>
 </bindings>

 <behaviors>
 <serviceBehaviors>
 <behavior name="">
 <serviceMetadata httpGetEnabled="true" />
 <serviceDebug includeExceptionDetailInFaults="true" />
 </behavior>
 </serviceBehaviors>
 </behaviors>

 <services>
 <service name="MyService.HomeService">
 <endpoint address="http://127.0.0.1:1920/HomeService" binding="basicHttpBinding" contract="MyService.IHomeService">
 <identity>
 <dns value="localhost" />
 </identity>
 </endpoint>

 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
 <host>
 <baseAddresses>
 <add baseAddress="http://127.0.0.1:1920"/>
 </baseAddresses>
 </host>
 </service>
 </services>

 </system.serviceModel>
</configuration>

5. 然后通过 servicehost 启动服务端
using System;
using System.ServiceModel;

namespace MyService
{
 class Program
 {
 static void Main(string[] args)
 {
 using (ServiceHost host = new ServiceHost(typeof(HomeService)))
 {
 try
 {
 host.Open();

 Console.WriteLine("服务开启!");

 Console.Read();
 }
 catch (Exception e)
 {
 Console.WriteLine(e.Message);
 }
 }
 }
 }
}

好了,到现在为止,服务端全部开启完毕,接下来我们通过“添加服务引用”,来添加对客户端的引用

using System;

namespace ConsoleApplication1
{
 class Program
 {
 static void Main(string[] args)
 {
 HomeServiceReference.HomeServiceClient client = new HomeServiceReference.HomeServiceClient();

 var s = client.GetLength("12345");

 Console.WriteLine("长度为:{0}", s);

 Console.Read();
 }
 }
}

麻蛋,就这么简单,是的,就这样简单的五步,基于http的通信就这样被不小心的完成了,真不好意思。

二:netTcpBinding

  有了basic的代码,现在我们要改成tcp通信,这会通信走的是字节流,很简单,改一下服务端的config文件就好了,大家也知道这种性能要比basic好。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
 <behaviors>
 <serviceBehaviors>
 <behavior name="mxbehavior">
 <serviceMetadata httpGetEnabled="true" />
 <serviceDebug includeExceptionDetailInFaults="true" />
 </behavior>
 </serviceBehaviors>
 </behaviors>

 <services>
 <service name="MyService.HomeService" behaviorConfiguration="mxbehavior">
 <endpoint address="net.tcp://localhost:19200/HomeService" binding="netTcpBinding" contract="MyService.IHomeService">
 <identity>
 <dns value="localhost" />
 </identity>
 </endpoint>

 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
 <host>
 <baseAddresses>
 <add baseAddress="http://localhost:1920/HomeService"/>
 </baseAddresses>
 </host>
 </service>
 </services>

 </system.serviceModel>
</configuration>

三:netMsmqBinding

  msmq这个玩意,我想大家都清楚,一个物理上的文件,好处呢,你也明白,就是client和service的所有通信都要经过它的手,这样任何一方出了问题,只要

它在就没问题了。同样我们把tcp改成msmq也是非常简单的,不过要注意,msmqbinding中是不可以让契约方法有返回值的。所以我们加上isoneway就好了。

using System.Runtime.Serialization;
using System.ServiceModel;

namespace MyService
{
 [ServiceContract]
 public interface IHomeService
 {
 [OperationContract(IsOneWay = true)]
 void GetLength(string name);
 }
}

然后我在mmc上新建一个消息队列,如下:

然后我们再改动以下配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
 <behaviors>
 <serviceBehaviors>
 <behavior name="mxbehavior">
 <serviceMetadata httpGetEnabled="true" />
 <serviceDebug includeExceptionDetailInFaults="true" />
 </behavior>
 </serviceBehaviors>
 </behaviors>
 <bindings>
 <netMsmqBinding>
 <binding name="msmqbinding">
 <security mode="None"/>
 </binding>
 </netMsmqBinding>
 </bindings>
 <services>
 <service name="MyService.HomeService" behaviorConfiguration="mxbehavior">
 <endpoint address="net.msmq://localhost/private/homequeue" binding="netMsmqBinding"
 contract="MyService.IHomeService" bindingConfiguration="msmqbinding">
 <identity>
 <dns value="localhost" />
 </identity>
 </endpoint>

 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
 <host>
 <baseAddresses>
 <add baseAddress="http://localhost:19200/HomeService"/>
 </baseAddresses>
 </host>
 </service>
 </services>

 </system.serviceModel>
</configuration>

纵观上面的三种binding,配置起来何其简单,底层的各种通讯协议貌似对我来说都是透明的,其实呢???wcf在底层做了何其多的事情,而我却没有挖掘。。。

这对码农里说也是一种悲哀啊。。。出了问题就只能祷告上天。。。下一篇我会开始深入剖析。

相关文章
艾伟:[WCF中的Binding模型]之一: Binding模型简介
1. 信道层与服务模型层(Channel Layer and Service Mode Layer) 对于一个分布式应用的开发与设计来说,通信问题是不得不考虑,同时也是最为复杂、最难实现的问题。在过去的若干年中, 微软先后推出了一系列广受欢迎的通信技术, 比如DCOM、Enterprise Service、.NET Remoting、XML Web Service、MSMQ等等。
1051 0
|
安全 网络协议 数据安全/隐私保护
艾伟:[WCF中的Binding模型]之六(完结篇):从绑定元素认识系统预定义绑定
由于绑定对象由一系列有序的绑定元素组成,绑定元素最终决定着信道栈中信道的组成,而信道的组成最终又决定了信道栈对消息进行处理的方式和能力,所有要确定绑定的特性和能力,我们可以通过查看其绑定元素的构成来一窥究竟。
934 0
艾伟:[WCF的Binding模型]之三:信道监听器(Channel Listener)
信道管理器是信道的创建者,一般来说信道栈的中每个信道对应着一个信道管理器。基于不同的消息处理的功能,将我们需要将相应的信道按照一定的顺序能组织起来构成一个信道栈,由于信道本身是由信道管理器创建的,所以信道对应的信道管理器也构成一个信道管理器栈,栈中信道管理器的顺序决定由它所创建信道的顺序。
932 0
艾伟:[WCF的Binding模型]之四:信道工厂(Channel Factory)
由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂。和服务端的信道监听其相比,处于客户端的信道工厂显得简单。从名称就可以看得出来,信道工厂的作用就是单纯的创建用于消息发送的信道。我们先来看看与信道工厂相关的一些接口和基类的定义。
1081 0
|
网络协议 网络架构 Windows
|
安全 网络协议 消息中间件
跟着Artech学习WCF扩展(1) Binding进行通信
这个demo简单 就一个服务器段的一个客户端的 主要是注释 Server的 using System; using System.Collections.Generic; using System.
716 0