zoukankan      html  css  js  c++  java
  • WCF简单学习

    前两天学习了WCF的一些基础东西,好像不怎么用,但是学习一下还是有助自己增长知识滴。既然是学习就先偷一下别人的概念基础。wcf中有一个ABC的概念,就是第一: "A" 是地址,就是告诉别人我wcf在何处。第二: "B"是绑定,就是告诉别人应该走什么路才能过来。第三: "C"是契约:就是告诉别人我wcf这里有哪些东西。然后就直接用例子来学习呗:

    首先和简单的建一个WCF的类库:WCF Service Library,这个里面就是契约,有一个服务的协定,是一个接口Iservice1:

    上面那个方法不用管他干嘛的,只要加入你的service operations就可以了,这里的看到方法上面有一个OperationContractAttribute,这个是可以供客户端程序调用,如果没有这个的话,客户端的机器就调不到这个方法。

    然后下面有一个Service1的类,是需要实现上面那个接口:

    然后用一个console程序来启动这个服务,然后把上面类库中的App.config移动到这个console程序中来。先来看看这个config文件:

    然后就可以很容易的启动服务:

    ServiceHost sh = new ServiceHost(typeof(Service1));
    sh.Open();
    Console.WriteLine("服务启动");
    View Code

    当然也可以改ABC的内容如这样:

    host.AddServiceEndpoint(typeof(IService1),                  //契约(C)  
    new BasicHttpBinding(),             //绑定(B)  
    "http://localhost:9999/myservice"); //地址(A)  
    View Code

    这样服务就启动了,服务启动后,就可以建一个客户端client,右键加入Add Service Reference,把地址输入就能引用服务内的方法了。

    上面的应用只是最基础的一个应用,更多的还是需要定义一些实体类,而且必须在类上加上【DataContract】,属性上加【DataMember】。然后先来看看两个带数据协定的类:

    [ServiceContract]
        public interface IService1 {
            [OperationContract]
            string GetData(int value);
    
            [OperationContract]
            CompositeType GetDataUsingDataContract(CompositeType composite);
    
            // TODO: Add your service operations here
            [OperationContract]
            Employee GetEmployeeInfo();
        }
    
    
        [DataContract]
        [KnownType("KnowType")]
        public class Employee {
            [DataMember]
            public string Name { get; set; }
    
            [DataMember]
            public int Age { get; set; }
    
            [DataMember]
            public AddInfo Address { get; set; }
    
            [DataMember]
            public object Scores { get; set; }
    
            static Type[] KnowType() {
                return new Type[] { typeof(Dictionary<string, int>) };
            }
        }
    
        [DataContract]
        public class AddInfo {
            [DataMember]
            public string City { get; set; }
    
            [DataMember]
            public String DetailAddress { get; set; }
        }
    View Code

    可以看到其中一个类的字段有另一个类的对象,而且还有一个Dictionary是不能被识别的,所以需要用KnownType的特性才能被识别。然后看下实现类:

    public Employee GetEmployeeInfo() {
                Employee em = new Employee();
                AddInfo info = new AddInfo();
                em.Name = "DK";
                em.Age = 12;
                info.City = "SH";
                info.DetailAddress = "DontKnow";
                em.Address = info;
                Dictionary<string, int> sc = new Dictionary<string, int>();
                sc.Add("体育", 10);
                em.Scores = sc;
                return em;
            }
    View Code

    除了【DataContract】还有一个【MessageContract】,这两个东西差不多,一般MessageContract在stream文件上传的时候会用到,如果不使用MessageContract,传入参数或传出参数若有Stream对象,那便只能有一个Stream对象。如果需要一个文件名就需要用到MessageContract,把文件名等等一些文件的元数据用MessageHeader标记,文件数据流用MessageBody标记可以成功。

    基础的话这些就可以用起来了,然后接下来需要多看看书才行,最后放一个完整的例子仅供参考:ServerTest

  • 相关阅读:
    linux shell执行远程计算机上的命令或者脚本(ssh)
    人到中年,愿我们的人生无悔
    资料
    新博客
    移植ok6410
    pm剩余要看的内容
    kernel boot
    regulator
    pm
    bochs安装一系列问题
  • 原文地址:https://www.cnblogs.com/socialdk/p/3237372.html
Copyright © 2011-2022 走看看