内容简介:那天有个小孩教我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;
修饰这个文件
[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引用
然后接口层,加入新的方法
实现层,实现方法,在对应的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,然后客户端中 右键
更新服务引用
此时wsdl中
客户端生成了几个代理类,这些是 工具 生成的,我们暂时不研究。
由于服务端 增加了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; } } }
此时的Host端的控制台,也输出了操作日志,这行代码我在服务端的实现中写的。说明2个控制台不会互相影响的。
当然随着契约实体的复杂,当然还有其他的数据类型,当然支持几个实体类嵌套关系的。感兴趣的自己尝试。
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 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。
推荐您阅读更多有关于“”的文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 消息队列解耦是骗小孩儿的
- 那天有个小孩教我WCF【3/31】
- 那天有个小孩教我WCF【2/31】
- 那天有个小孩教我WCF【1/31】
- 那天有个小孩教我WCF【2/31】
- 那天有个小孩教我WCF【1/31】
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Programming Amazon Web Services
James Murty / O'Reilly Media / 2008-3-25 / USD 49.99
Building on the success of its storefront and fulfillment services, Amazon now allows businesses to "rent" computing power, data storage and bandwidth on its vast network platform. This book demonstra......一起来看看 《Programming Amazon Web Services》 这本书的介绍吧!