那天有个小孩教我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 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。

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


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

查看所有标签

猜你喜欢:

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

C#图解教程

C#图解教程

索利斯 / 苏林、朱晔 / 人民邮电出版社 / 2009-1 / 65.00元

本书是一本广受赞誉的C# 教程。它以图文并茂的形式,用朴实简洁的文字,并辅之以大量表格和代码示例,精炼而全面地阐述了最新版C# 语言的各种特性,使读者能够快速理解、学习和使用C#。同时, 本书还讲解了C#与VB 、C++ 等主流语言的不同点和相似之处。 本书是一本经典的C# 入门书,不仅适合没有任何编程语言基础的初级读者,而且还是有VB 、C++ 等语言基础的C# 初学者的最佳选择。一起来看看 《C#图解教程》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具