十五天精通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在底层做了何其多的事情,而我却没有挖掘。。。

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

时间: 2024-11-08 20:20:20

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

十五天精通WCF——第三天 client如何知道server提供的功能清单

原文:十五天精通WCF--第三天 client如何知道server提供的功能清单  通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一个道理,只有client了解service能提供哪些功能,client才可以根据server提供的功能进行 消费,那问题来了,service怎么把功能提供给client进行选择呢???这个就是我这一篇要聊的wsdl(w

十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置

原文:十五天精通WCF--第十天 学会用SvcConfigEditor来简化配置        我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟们来说,有些困难,而且一些服务配置也容易遗漏,大多情况下,我们都是copy一份服务配置,然 后在服务配置上面修修改改,对吧...其实呢,.net给我们提供了一个强大的scvconfigeditor这个工具

十五天精通WCF——第八天 对“绑定”的最后一点理解

原文:十五天精通WCF--第八天 对"绑定"的最后一点理解 转眼已经中断10几天没有写博客了,也不是工作太忙,正好碰到了端午节,然后最近看天津台的爱情保卫战入迷了...太好看了,一直都是回味无穷...而且 涂磊老师话说的真是tmd的经典,然后就这样耽搁了,好了,话不多说,这篇我们看看binding中最后一点需要知道的东西.   一:信道栈 我在之前的文章中多次提到信道栈,不知道大家对它的概念是否有了解,其实想想也还是蛮简单的,既然是栈,那么这个栈肯定就不止一个元素了,对吧,第二个 的话

十五天精通WCF——第二天 告别烦恼的config配置

原文:十五天精通WCF--第二天 告别烦恼的config配置   经常搞wcf的基友们肯定会知道,当你的应用程序有很多的"服务引用"的时候,是不是有一种疯狂的感觉...从一个环境迁移到另外一个环境,你需要改变的 endpoint会超级tmd的多,简直就是搞死了人...好了,这篇我们来看看如何最小化配置.   一:精简service的config配置 就像上一篇的代码一样,我的service端的config配置如下: 1 <?xml version="1.0"

十五天精通WCF——第十二天 说说wcf中的那几种序列化

原文:十五天精通WCF--第十二天 说说wcf中的那几种序列化 我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf中默认的序列化是DataContractSerializer,确实是这样,不过wcf在信道中 其实不仅仅支持DataContractSerializer,它还支持其他类型的序列化,比如XmlSerializer,NetDataContr

十五天精通WCF——第五天 你需要了解的三个小技巧

一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做"服务是端点的集合",就 比如说一个普普通通的服务,它就公布了一个服务端点,一个元数据端点,对吧... 仔细一想,这个问题就好玩了,既然一个service可以公布多个endpoint,而且我还知道wcf中有很多的binding,这些binding对应着很多的传输方式,那是不是 说我一个service可以用多种协议方法对外公布,比如

十五天精通WCF——第十四天 一起聊聊FaultException

 我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错误返回到客户端,就比如下面这样.     从这张图中,我故意输入了xss字符,然后的然后,web程序自爆异常,其实我想表达的意思就是,虽然说web程序抛异常了,但不代表iis就 挂了,所以iis还是需要给客户端做出反馈,这就有了http header,和body信息,同样的道理,wcf的服务器异常机

十五天精通WCF——终结篇 那些你需要注意的坑

终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果 不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧. 一: 第一个大坑 [数据传输量] 我们使用wcf的目的,就是用来进行分布式的数据交互,既然是交互,就一定要进行数据交换,可能一些新人并没有注意到wcf在数据传输量上 面做了一个大小限制,比如我现在要传输一个2m的txt给service,会出现什么情况??? static void Main(string[]

十五天精通WCF——第六天 你必须要了解的3种通信模式

wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦,单向,请求-响应,双工模式,其中的第二种"请求-响应" 模式,这个大家不用动脑子都清楚,这一篇我大概来分析下. 一:"请求-响应"模式 如果你看了我上一篇的博文,你应该非常清楚这种类似"本地调用"的方式,wcf同样也分为"同步"和"异步"两种,不过不管是异步还是同步,最终都逃 不过是"请求-响应"这个事实