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

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

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

PHP典型模块与项目实战大全

PHP典型模块与项目实战大全

杨宇 / 清华大学出版社 / 2012-1 / 79.00元

《PHP典型模块与项目实战大全》以实战开发为原则,以PHP典型模块和项目开发为主线,通过12个高质量的PHP典型模块和6个PHP大型应用,向读者揭示了Web开发的整体结构,并详尽地介绍PHP开发与建站的技术要点。《PHP典型模块与项目实战大全》附带1张DVD,内容是作者为《PHP典型模块与项目实战大全》录制的全程多媒体语音教学视频及《PHP典型模块与项目实战大全》所涉及的源代码。《PHP典型模块与......一起来看看 《PHP典型模块与项目实战大全》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

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

正则表达式在线测试