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


      

      转眼已经中断10几天没有写博客了,也不是工作太忙,正好碰到了端午节,然后最近看天津台的爱情保卫战入迷了。。。太好看了,一直都是回味无穷。。。而且

    涂磊老师话说的真是tmd的经典,然后就这样耽搁了,好了,话不多说,这篇我们看看binding中最后一点需要知道的东西。

    一:信道栈

      我在之前的文章中多次提到信道栈,不知道大家对它的概念是否有了解,其实想想也还是蛮简单的,既然是栈,那么这个栈肯定就不止一个元素了,对吧,第二个

    的话,既然是栈,那么肯定就遵循FILO的原则,可能你会说,这个还是蛮抽象的,能给个具体的例子么???恭喜你,wcf中还真有一个方法CreateBindingElements,

    下面我们具体看看。。。

    1.  简单看看各种binding的栈中都有些什么

      

    看到上面的监控窗口,是不是有点意思,在BasicHttpBinding的信道栈中有两个元素,分别是HttpTransportBindingElement和TextMessageEncodingBindingEl

    ement,通过名字也能很容易的判断出来,一个是“http传输协议”,一个是“文本消息编码协议”,然后再看看复杂一点的WSHttpBinding,你会发现,他不光有Basic

    的所有东西,还包括SymmetricSecurityBindingElement(安全协议) 和 TransactionFlowBindingElement(事务流),现在你心中是不是有底了,起码我知道各

    种Binding里面都有些啥,为了更好的理解,我来画一张简图。

    上面这个图,大概也就表达了我的意思,当我们Client在走WSHttpBinding这个协议的时候,Client端的InputMessage会先走 TransactionFlow,SymmetricSec

    urity,TextMessageEncoding,最后走HttpTransport,然后Service端就按照客户端进行“反向处理”,通过一阵禁脔之后,我们就拿到了安全的OutputMessage。

    二:BindingElement的跨绑定性

      你要是很仔细的话,你肯定会发现,其实Binding就是一个预先默认配置好的信道栈,对不对,你也看到了,每一种Binding都有属于自己的BindingElements,

    恰恰这些Elements是可以跨Binding的,也就是说我可以自由组合Elements,这样是不是可以给我们这些寒酸的码农最大的灵活性,对吧,举个简单的例子,

    BasicHttpBinding有两个绑定元素,其中对soap消息进行的是TextMessageEncoding编码对吧,而netTcpBinding对soap进行的BinaryMessageEncoding,

    然后你也应该知道了,我想做一个自定义的Binding,其中消息编码是BinaryMessage,传输协议是HttpTransport,那怎么做呢????

    Host文件:

    复制代码
     1     class Program1
     2     {
     3         static void Main(string[] args)
     4         {
     5             ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://192.168.1.105:1920"));
     6 
     7             var customBinding = new CustomBinding();
     8 
     9             customBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
    10             customBinding.Elements.Add(new HttpTransportBindingElement());
    11 
    12             host.AddServiceEndpoint(typeof(IHomeService), customBinding, "HomeServie");
    13 
    14             host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
    15 
    16             host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
    17 
    18             host.Open();
    19 
    20             Console.WriteLine("服务已经开启!!!");
    21 
    22             Console.Read();
    23         }
    24     }
    复制代码

    Client调用:

    复制代码
     1     static void Main(string[] args)
     2         {
     3             ServiceReference1.HomeServiceClient client = new ServiceReference1.HomeServiceClient();
     4 
     5             var result = client.Update("你好");
     6 
     7             Console.WriteLine("server value:" + result);
     8 
     9             Console.Read();
    10         }
    复制代码

    最后我们用Fiddler监视一下,最后我们看看,都是些乱码。

    这篇就说到这里了,希望对你有帮助,下一篇我们看看WCF中的Behavior,很好玩的哦~~~

  • 相关阅读:
    桟错误分析方法
    gstreamer调试命令
    sqlite的事务和锁,很透彻的讲解 【转】
    严重: Exception starting filter struts2 java.lang.NullPointerException (转载)
    eclipse 快捷键
    POJ 1099 Square Ice
    HDU 1013 Digital Roots
    HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
    HDU 1159 Common Subsequence
    HDU 1069 Monkey and Banana(动态规划)
  • 原文地址:https://www.cnblogs.com/go-jzg/p/6281857.html
Copyright © 2020-2023  润新知