那天有个小孩教我WCF【3/31】

栏目: ASP.NET · 发布时间: 7年前

内容简介:那天有个小孩教我WCF【3/31】

WCF整体系统学习,2016-11-11 -2016-11-27          开发环境vs2015  .net framework 4.0    触屏WPF教程暂时搁置

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

啥契约,来说都是一个接口,在C#中,接口拓展一个类的行为,添加一个统一风格,到处收儿子。

服务,数据,消息

我想花费31天,系统学习WCF,跟上脚步,修炼 内功

数据契约

DataContract标记实体类,DataMember标记属性

System.Runtime.Serialization下的 DataContractSerializer 类专为WCF设计,快,效率高

POCO对象,比如string,int等常用对象,都归纳为POCO

由于参数过多,我们可以封装为类,也就是OOP中的封装,但是为了wcf,需要在上面标记DataContract和DataMember

POCO对象如果不需要暴露给客户端,使用IgnoreDataMember标记

新建AYUIModels程序集,这里存放Model

我建立了2个普通类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AYUIModels
{
    public class AyRequest
    {
        public string Ip { get; set; }

        public string UserName { get; set; }

        public DateTime ReqDateTime { get; set; }

        public string Action { get; set; }
        
        public long Timestamp { get; set; }
    }


}

一个模拟响应

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AYUIModels
{
    public class AyResponse
    {
        public string ConnectionId { get; set; }

        public string ClientIp { get; set; }

        public DateTime ServerDate { get; set; }

    }


}

我们引用 序列化标记类

using System.Runtime.Serialization;

那天有个小孩教我WCF【3/31】

修饰这个文件

    [DataContract]
    public class AyResponse
    {
        [DataMember]
        public string ConnectionId { get; set; }
        [DataMember]
        public string ClientIp { get; set; }
        [DataMember]
        public DateTime ServerDate { get; set; }

    }

DEMO测试,使用这2个约定的类

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

分别在接口和接口实现层,添加model引用

然后接口层,加入新的方法

那天有个小孩教我WCF【3/31】

实现层,实现方法,在对应的ProductService中实现方法

       public AyResponse GetServerTime(AyRequest req)
        {
            AyResponse res = new AyResponse();
            res.ServerDate = DateTime.Now.AddMinutes(1);//模拟时间
            res.ClientIp = req.Ip;
            res.ConnectionId = Guid.NewGuid().ToString();
            //记录日志
            Console.WriteLine("客户端:"+req.Ip+":请求了操作:"+ req.Action);
            return res;
        }

编译项目,然后启动host,然后客户端中 右键

那天有个小孩教我WCF【3/31】

更新服务引用

那天有个小孩教我WCF【3/31】

此时wsdl中

那天有个小孩教我WCF【3/31】

那天有个小孩教我WCF【3/31】

客户端生成了几个代理类,这些是 工具 生成的,我们暂时不研究。

由于服务端 那天有个小孩教我WCF【3/31】 增加了Ignore,所以客户端的代理类中也是没有的。

客户端增加测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using AYOrderSystem.OpenProductService;

namespace AYOrderSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            using (OpenAYUIService.BuyServiceClient client = new OpenAYUIService.BuyServiceClient())
            {
                Console.WriteLine(client.GetPrice(2));
            }
            using (AYUIProductServiceClient client = new AYUIProductServiceClient())
            {
                Console.WriteLine(client.GetAYQQByVersionOverloaded("6.2", DateTime.Now));

                AyRequest req = new AyRequest();
                req.Action = "我想获取服务器时间";
                req.Ip = GetAddressIP();
                req.ReqDateTime = DateTime.Now;
                req.UserName = "AY";

                var _1 = client.GetServerTime(req);
                Console.WriteLine("连接ID:"+_1.ConnectionId);
                Console.WriteLine("服务端时间为:"+_1.ServerDate);
                Console.WriteLine("客户端的IP是:"+_1.ClientIp);
            }

            Console.ReadLine();
        }

        /// <summary>
        /// 获取本地IP地址信息
        /// </summary>
        static string GetAddressIP()
        {
            ///获取本地的IP地址
            string AddressIP = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    AddressIP = _IPAddress.ToString();
                }
            }
            return AddressIP;
        }
    }


}

那天有个小孩教我WCF【3/31】

此时的Host端的控制台,也输出了操作日志,这行代码我在服务端的实现中写的。说明2个控制台不会互相影响的。

那天有个小孩教我WCF【3/31】

当然随着契约实体的复杂,当然还有其他的数据类型,当然支持几个实体类嵌套关系的。感兴趣的自己尝试。

KnownTypes特性,用于 标记元数据返回的子类类型,因为我们代码中写的返回值是父类。 实际返回是子类,需要明确标记类型

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

在AYUIModels程序集中新建个子类 AyResponseSub1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace AYUIModels
{
    [DataContract]
    public class AyResponseSub1:AyResponse
    {
        [DataMember]
        public string Memo { get; set; }
    }


}

AyResponseSub2.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace AYUIModels
{
    [DataContract]
    public class AyResponseSub2:AyResponse
    {
        [DataMember]
        public string Memo2 { get; set; }
    }
}

修改实现,这个时候我们还没有标记 KnownTypes  特性

 public AyResponse GetServerTime(AyRequest req)
        {
            //AyResponse res = new AyResponse();
            //res.ServerDate = DateTime.Now.AddMinutes(1);//模拟时间
            //res.ClientIp = req.Ip;
            //res.ConnectionId = Guid.NewGuid().ToString();
            ////记录日志
            //Console.WriteLine("客户端:"+req.Ip+":请求了操作:"+ req.Action);



            AyResponseSub1 res = new AyResponseSub1();
            res.ServerDate = DateTime.Now.AddHours(1);//模拟时间
            res.ClientIp = req.Ip;
            res.ConnectionId = Guid.NewGuid().ToString();
            res.Memo = "测试来着";
            //记录日志
            Console.WriteLine("2.0 客户端:" + req.Ip + ":请求了操作:" + req.Action);
            return res;
        }

更新服务后,运行客户端,报错了

“System.ServiceModel.CommunicationException”类型的未经处理的异常在 mscorlib.dll 中发生

其他信息: 接收对 http://localhost:1111/AYUIProductService 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。

推荐您阅读更多有关于“”的文章


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出Rust

深入浅出Rust

范长春 / 机械工业出版社 / 2018-8-21 / 89.00元

本书详细描述了Rust语言的基本语法,穿插讲解一部分高级使用技巧,并以更容易理解的方式解释其背后的设计思想。全书总共分五个部分。 第一部分介绍Rust基本语法,因为对任何程序设计语言来说,语法都是基础,学习这部分是理解其他部分的前提。 第二部分介绍属于Rust独一无二的内存管理方式。它设计了一组全新的机制,既保证了安全性,又保持了强大的内存布局控制力,而且没有额外性能损失。这部分是本书......一起来看看 《深入浅出Rust》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具