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右键点击更新服务引用,这样在之前添加的服务中的方法,在客户端就可以看到了

  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/cwyblog/p/2842941.html
Copyright © 2011-2022 走看看