ffxdz
来自反方向的钟。本博客所有文章均为原创,如有雷同,一定是他人转载本博客。

导航

 

     为了搞明白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学习经验。

 

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

posted on 2014-03-12 14:18  ffxdz  阅读(708)  评论(2编辑  收藏  举报