• 【WCF学习随笔三】初见WCF。


         为了搞明白WCF的基本概念,我这两三天备受煎熬,可谓艰难啊!那么久了始终没有等来土豪金肥皂月的视频密码,我只能继续在网上参考着别人零散的经验文章,一点一点的把自己的知识补全。

         今天,我就来给大家讲讲WCF的一部分基本概念,力图让大家看了就忘不了,开讲。

     

         WCF能做的事情远不止soap那么简单,但我今天要提到的依然还是soap。这篇随笔我要提到的主要有几个关键词:契约、寄主、基地址、终结点、配置文件。

         契约,这个狂拽炫酷叼炸天的名词,不知道是哪个翻译者翻译来的。他的原型是contract(n. 合同 v.约定),将单词重新翻译一次,他的装逼行为就暴露无遗了。他就是一个约定,你可以想象,生意双方在成交一笔交易之前,是不是要互相达成对方的要求,并根据约定立下一份合同,这就是soap中的“契约”。

     

    最简单的WCF应用模型,我给大家画个图就能说清楚(绝逼原创):

    从服务端开始说起,接口就是interface,需要一个在背后默默支持它的类来实现。最基本的契约就是两个方括号,[ServiceContract]和[OperationContract],前者用来描述可以被暴露的接口,后者用来描述可以被暴露的接口中可以被暴露的方法,使用方法很简单,如下:

    (在此之前,大家需要在项目“引用”处添加引用“System.ServiceModel”命名空间,以及在每个.cs文件的头部都加上using System.ServiceModel;不然以下所有操作都无法正常进行。)

    [ServiceContract]
        public interface Ihello
        {
           [OperationContract]
           string hello();
           [OperationContract]
           string sayhello(string str);
    
           string sayfuck();
        }
       public interface Ifuck
       {
           string fuck();
       }

         仅需将方括号写在被描述的接口和函数之前即可。接口Ihello里的hello和sayhello方法被曝光在网络服务中,sayfuck方法则不能被曝光,接口Ifuck更加不会被曝光。
    服务端对接口访问权限的限定,客户端能对接口做什么完全由服务端决定,这就是我对看起来高大上的Contract肤浅的理解。

         类实现接口部分,这是C#基础语法,我就不说了。

         在接口被契约限制,并被类实现之后,这个服务功能是写好。但是编译这些.cs文件生成的动态链接库(.dll)是不能直接被运行在Windows上的,必须有个靠谱的.exe干爹做靠山,WCF服务才能发挥作用,这个干爹被我们称作寄主,依靠干爹的行为被称为寄宿或者挂载。干爹帮你实现作用价值之前,必须了解别人会以什么方式和你交易、你们在交易些什么、双方有什么条件等信息,干爹才能根据这些信息来为你办事。这里说的信息,则被我们称为配置文件(.config),这部分逻辑虽然简单,但非常烦,我来帮大家梳理一下就能搞清楚了。

         这是一个在服务端目录下最基本的应用程序配置文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="helloservicehost.hello" behaviorConfiguration="feizaoyue">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/hello"/>
              </baseAddresses>
            </host>
            <endpoint address="" binding="basicHttpBinding" contract="hellowcf.Ihello"></endpoint>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="feizaoyue">
              <serviceMetadata httpGetEnabled="true"/>          
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

    这个配置没什么逻辑可言,这个树形结构就和当年学html一样,到底哪个节点嵌在哪个节点里面,大家需要记忆。

    <system.serviceModel>是贯穿全程的必须要的命名空间。

    <services>是一个服务配置的集合,他里面可以有若干个服务配置。

    <service>就是被包含在<services>里的单个服务配置。其中name属性指定了实现[ServiceContract]的类,behaviorConfiguration属性值则是和后面的指定<behavior>标签的name属性值保持一致。

    <baseAddresses>是基地址,就是那个用来给客户端引用的网络地址,只要符合实际情况,貌似是可以随便设置的,也可以设置多个。

    <endpoint>是终结点,其中包含三部分:Address、Binding和Contract。如果address值为空,那么endpoint的地址就是默认的基地址(Base Address)。如果设置了呢?我也不知道,以后会详细来讲解。binding部分指的应该是信息传送的连接方式,这里填写了“basicHttpBinding”,微软为此定义了更多种方式,往后我也会详细讲解。剩下的就是contract属性了,这里指定的是用来作为契约的那个接口。

    <behaviors>部分和我没有写出来的<bindings>一样,属于是可选项,可以写,也可以不写。里头<behavior>中的name属性和上面<service>的behaviorConfiguration属性保持一致,在上面的代码中,只有<serviceMetadata httpGetEnabled="true"/>限制了WCF服务通过http的访问权限。其他和WCF服务有关的行为契约,也是我往后才能详解的内容。

         这个配置文件中,其他部分的内容,大家暂时来说照葫芦画瓢就行了,因为我就是这么干的。

         (我是绝对不会告诉你VS在“工具”菜单下自带了一个WCF配置文件编辑器让你不用手动敲代码就能设置好配置文件的!)

     

         讲完了配置文件,我们来说说寄主,也就是我们上面提到的干爹。寄主只分两种,一种是普通的应用程序,另一种则是IIS。两种寄主相比起来各有优劣,应用程序可以开发得更加灵活,让他成为一个你所希望的客户端,而IIS有微软护航,则更加安全稳定。其他的就没什么好讲的了,我这里寄主的DEMO写在了WindowsForm上,整个过程也简单的离谱:(在WindowsForm中,上述的配置文件需要自己手动添加,名称为app.config)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.ServiceModel;
    
    namespace helloservicehost
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            ServiceHost host = null;
    
            private void button1_Click(object sender, EventArgs e)
            {
                host = new ServiceHost(typeof(helloservicehost.hello));//这个helloservicehost.hello 就是那个实现了契约接口的类
                host.Open();
                label1.Text = "服务启用成功";
            }
        }
    }

         调试以后,如果报错:HTTP 无法注册 URL http://+:8080/hello/。进程不具有此命名空间的访问权限。这是因为你的系统安全策略太牛逼,你需要关掉VS并重新用管理员权限打开一次,问题就能得以解决。

        相同的,如果希望把服务寄宿到IIS上,新建一个ASP.NET新项目,新建一个WCF服务(.svc)同样的写好那一个带方括号的接口和实现他的类,一模一样。然后再一模一样的写好目录下的web.config。按照我【WCF学习随笔二】中讲述的“发布”站点方法发布并设置好IIS即可。

        在winform里运行了host.open()函数或者IIS里的网站启动以后,WCF服务算是发布成功了,客户端的引用同样需要你回顾一下【WCF学习随笔二】中关于客户端调用Webservice的内容,操作步骤基本是一致的。

        唉,学习不容易,写博客也不容易,在这个文本编辑框前一坐就是几小时,总结知识和敲demo,然后编辑到文章里。现在时刻14:16 PM,老子午饭还没吃呢!算求,等会一下把晚饭一起给吃了就好了。今天讲的内容给大家普及了WCF最基础的概念知识,WCF是一个很深的坑啊,里面还有很多强大的功能等着我们去学习,我也会持续的与大家在这里分享我的WCF学习经验。

    近期预告:深入解析地址、绑定、契约等知识。

  • 相关阅读:
    玩转web之javaScript(五)---js和jquery一些不可不知的方法(input篇)
    设计模式 外观模式 一键电影模式
    设计模式 适配器模式 以手机充电器为例
    高仿微信5.2.1主界面架构 包含消息通知
    Java进阶 创建和销毁对象
    sql语句中单引号嵌套问题
    Spark SQL UDF和UDAF示例
    Spark Parquet使用
    iptables只允许指定ip访问本机的指定端口
    Spark On YARN内存和CPU分配
  • 原文地址:https://www.cnblogs.com/ffxdz/p/3596089.html
Copyright © 2020-2023  润新知