积极答复者
制造业企业内部应用如何搭建WCF,能方便地从winforms和browser访问

问题
-
我是一个老程序员了,最近刚接触WCF,甚至是刚接触.net(但请相信我的学习能力,我能很快上手),为了能缩短学习路径,希望有人给我建议.
我在一家电子产品制造业公司工作,身兼架构师、程序员、DBA等多项职能(相信有很多程序员是这样的),开发团队5个人,现有的系统是建立在DELPHI的MIDAS多层框架基础上的,考虑以后要转向.net框架,我希望中的系统框架是这样的:
1.服务端能HOST到winforms中,且由多个模块(wcf library?)动态组成,也就是能在HOST 界面动态加载某个模块或停止更新某个模块而不影响其它模块的使用,
2.客户端是winforms程序或browser
3.服务端是无状态的,也就是说客户端得到一个数据集后,即使网络断开、服务器停止重开等情况也能继续对该数据集操作
大体上我希望能实现上面的效果,在我学习了一个星期的WCF后,我觉得WCF太强大.net太庞大了,想要各方面都了解透实在是要耗费太多精力和时间(现在很缺这些),
那么,各位WCF、.NET前辈,我该如何规划呢,这里还要提一下一个具体的技术问题,我在试验.NET DATA MODEL的时候,用普通的WCF library,发现不能实现类似这样的servicecontract:
List<entityobject> GetData...; 也就是说返回实体对象集到客户端,除非自己定义DataContract中的类,把实体对象重新定义一遍,但这样就失去了entityobject的很多功能,
后来发现WCF DATA SERVICE能把entityobject暴露给客户端,但发现在wcf library中不能add wcf data service,很是迷惑.
诸如上述问题,我对.net框架还了解不够,希望有人能指点一下学习路径,不胜感激!
答案
-
1.WCF可以使用多种宿主程序来托管,Winform也可以,但是实际项目不推荐。因为考虑到企业应用大部分对于性能、可靠性、安全、伸缩性的要求等。一般推荐IIS或者Window服务。
2.客户端是Winform程序或者其他程序没有关系,WCF服务可以提供基于Web服务规范的服务,WCF3.5以后支持Rest风格的服务,完全没有问题,你可以使用原生态HTTP协议调用WCF服务。
3.服务是无状态的,也就是服务不维持任何客户端状态信息。离线操作,WCF支持,你也可以使用MSMQ消息队列来辅助完成这种功能。
4.WCF DataService 要安装一些辅助的类库,还有工具,方便开发。
Download and Install WCF Data Services and OData Libraries,你可以参考一下连接。
http://msdn.microsoft.com/zh-CN/data/ee720179
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
- 已标记为答案 Thinking_Dust 2011年3月23日 2:16
全部回复
-
1.WCF可以使用多种宿主程序来托管,Winform也可以,但是实际项目不推荐。因为考虑到企业应用大部分对于性能、可靠性、安全、伸缩性的要求等。一般推荐IIS或者Window服务。
2.客户端是Winform程序或者其他程序没有关系,WCF服务可以提供基于Web服务规范的服务,WCF3.5以后支持Rest风格的服务,完全没有问题,你可以使用原生态HTTP协议调用WCF服务。
3.服务是无状态的,也就是服务不维持任何客户端状态信息。离线操作,WCF支持,你也可以使用MSMQ消息队列来辅助完成这种功能。
4.WCF DataService 要安装一些辅助的类库,还有工具,方便开发。
Download and Install WCF Data Services and OData Libraries,你可以参考一下连接。
http://msdn.microsoft.com/zh-CN/data/ee720179
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
- 已标记为答案 Thinking_Dust 2011年3月23日 2:16
-
非学感谢版主详尽的答复,还得麻烦您帮我看一下一个具体的问题,这个问题困扰我好几天了.我实现一个简单的OperationContract,比如:
public Product GetOneProdByNum(string prodnum)
{
using(AdventureWorksEntities db =new AdventureWorksEntities())
{
return (from p in db.Products where p.ProductNumber.Contains(prodnum) select p).FirstOrDefault();
}}
其中,Product是由EDM自动生成的一个EntityObject,但我在客户端调用这个方法时总不成功,当然如果这里的返回类型换成在DataContract下自定义的类型就没问题,那是不是意味着EntityObject不能作为返回值呢.
盼复!
-
EntityObject属于什么类型呢?
我不是很了解。
WCF支持的类型是有要求的。
你看一下我的这个文章。当时MSDN介绍的。
WCF序列化器DataContractSerializer支持的数据类型
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
找到问题所在了,原来是因为这个entityobject有navigation properties,也就是相当于数据库表product有一个外键关联的表,如果不想在得到关联对象则需要将ContextOptions.LazyLoadingEnabled设为false.
总之,谢谢您的帮助!
太客气了~
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
-
能一开始就用WCF+EntityFrameWork来做示例,真是不简单。目前在msdn中并有发现详细解说实体对象与WCF技术的资料,这个在Entity Framework技术中有一个称为POCO的概念,目前在msdn档案中没有详细的说明,英文资料:programe Entity Framework 中有拽到,百度文库中有pdf档下载。
关于动态加载的部分,iis托管的情况下直接修改配置文件不会需要服务端重启,动态加载的部分或许会用到反射,或许利用iis的这一特性不需要用到,这一点暂未尝试。
- 已编辑 longjin 2011年3月25日 12:33 打错字
-
能一开始就用WCF+EntityFrameWork来做示例,真是不简单。目前在msdn中并有发现详细解说实体对象与WCF技术的资料,这个在Entity Framework技术中有一个称为POCO的概念,目前在msdn档案中没有详细的说明,英文资料:programe Entity Framework 中有拽到,百度文库中有pdf档下载。
关于动态加载的部分,iis托管的情况下直接修改配置文件不会需要服务端重启,动态加载的部分或许会用到反射,或许利用iis的这一特性不需要用到,这一点暂未尝试。
多谢你的指点,我会去查阅.关于动态加载,后来想其实也可以做成service contract然后从客户端来控制,自己企业内部的应用想怎么弄都行.
尘埃会思考,是奇迹也是痛苦的根源