zoukankan      html  css  js  c++  java
  • WCF实例及讲解

    第一步:创建一个空的解决方案,新建一个wcf服务库MyWcfServer1来模拟服务端,新建一个web应用程序项目WebApplication1来模拟客户端

    第二步:简单分析wcfservice1项目,该项目内容如下

    这个项目是模拟的服务器端,Service1.svc.cs文件里是服务引用的具体实现方法,而且Service1类是继承于 IService1.cs文件里的 IService1接口

    首先看IService1.cs文件,从名字上可以看得出这个是接口文件,里面定义了了一些接口,接口声明了一些方法。我在里面添加两个类 public class student1 、 public class student2 和一个 public student1  student1Class() 方法,sum()方法用作测试。代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace MyWcfServer1
    {
        [ServiceContract] //服务契约
        public interface IService1
        {
            [OperationContract]  //操作契约
            string GetData(int value);
    
            [OperationContract] //操作契约
            CompositeType GetDataUsingDataContract(CompositeType composite);
    
            [OperationContract]
            int sum(int i, int j); //sum()方法
    
            [OperationContract]
            student1 studentClass();  //student1类
        }
    
        [DataContract]
        public class student1       //student1类
        {
            string str = "from IService1's student1";
            [DataMember]
            public string Str { set { str = value; } get { return str; } }
    
        }
    
        [DataContract]
        public class student2
        {
            string str = "from IService2's student2";
            [DataMember]
            public string Str { set { str = value; } get { return str; } }
        }
    
        [DataContract]  //数据契约
        public class CompositeType
        {
            bool boolValue = true;
            string stringValue = "Hello ";
    
            [DataMember]  //数据成员
            public bool BoolValue
            {
                get { return boolValue; }
                set { boolValue = value; }
            }
    
            [DataMember]  //数据成员
            public string StringValue
            {
                get { return stringValue; }
                set { stringValue = value; }
            }
        }
    }

    1、服务契约     

          接口IService1前面加了 [ServiceContract] ,意思是把这个接口(包括继承这个接口的类)声明为服务契约,服务契约是对客户端而言的,就是这个接口 暴露 在客户端面前,就是让客户端可得见这个接口。但看得见接口不一定就看得见接口里面的方法(原因很简单,就算接口是可见的,但里面的方法也有一些是可见另一些不可见的嘛),如果想把方法也声明为对客户端可见的,得在声明方法的签名加 [OperationContract],这也叫服务契约。总结:服务契约有两种,[ServiceContract]是声明接口、类对客户端可见的,[OperationContract]是具体声明类里的那些方法对客户端可见。

    2、数据契约

         接口自带的类CompositeType 和我们自定义的类student1、student2 前面都加了 [DataContract] ,意思是把这个类声明为数据契约,这样子客户端就可以用这个类去定义变量了。这里说的类和上面说的类所指的具体内容稍稍有点不同,上面的类偏向于可以调用类中的方法,这里的类偏向于指作为一种类型(就像int string 等类型),可以用来定义变量。类对客户端可见,但类中的字段、变量则不一定(原理和上面说的一样),要在想暴露在客户端的字段、变量前面加 [DataMember] 。但不能在方法(如构造函数)前面加[DataMember],因为函数只能声明为服务契约嘛(加[OperationContract]),而服务契约只能在 [ServiceContract] 下面声明。总结:数据契约有两种,[DataContract]是声明类或结构的,[DataMember] 是声明类或结构中具体的字段或属性(推荐用属性)对客户可见。

    再来看Service.svc.cs文件。可以看到里面只是定义了一个继承 IService1接口的类 Service1,主要内容就是实现IService1接口里声明的方法。代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace MyWcfServer1
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
        public class Service1 : IService1
        {
            public int sum(int i, int j)
            {
                return i + j;
            }
    
            public student1 studentClass()
            {
                student1 stu = new student1();
                stu.Str = "我们是中国人";
                return stu;
            }
    
            public string GetData(int value)
            {
                return string.Format("You entered: {0}", value);
            }
    
            public CompositeType GetDataUsingDataContract(CompositeType composite)
            {
                if (composite == null)
                {
                    throw new ArgumentNullException("composite");
                }
                if (composite.BoolValue)
                {
                    composite.StringValue += "Suffix";
                }
                return composite;
            }
        }
    }

    第三步:分析WebApplication1项目

    复制app文件中的服务器地址

    在右键点击 WebApplication1项目,选择 添加服务引用(使用默认名称),会弹出一方框,将刚才复制的地址粘贴在地址栏,如下:

    点右边的 “发现”,就会检索出发现的服务并显示在左边,并把地址也显示出来。点左边 服务里发现的服务左边的三角形,一级级打开,赫然发现里面就是 Service1 类,再往下就是 Service1类继承的接口 IService1 !对应右边就是该服务提供给客户端调用的方法!,添加成功后即为:

    最后: 打开WebApplication1里的Program.cs文件,里面代码很简单,分别调用sum()方法和studentClass()方法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    
    namespace WebApplication1
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                wcfServer.Service1Client server = new wcfServer.Service1Client();
                int a = server.sum(1, 2);
                string str = server.studentClass().Str;
                Response.Write(str);
                Response.Write(a.ToString());
            }
        }
    }

    ps:每当服务器做出什么修改,则需要,右键点解决方案选择重新生成项目,然后选中wcfserver右键点击更新服务引用,这样在之前添加的服务中的方法,在客户端就可以看到了

  • 相关阅读:
    Git 分支使用
    ansible 2.7 API
    zabbix api
    (四)ansible 通过堡垒机访问内网服务器
    C#实体对象出现中文处理乱码的问题
    mysql数据库数据(字段数过大)太多导入不了的解决方法
    MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常 解决方法
    hibernate 主键生成方式
    HTN规划 jshop2
    自动驾驶
  • 原文地址:https://www.cnblogs.com/cwyblog/p/2842941.html
Copyright © 2011-2022 走看看