MyException - 我的异常网
当前位置:我的异常网» WCF » 01 WCF初识:WCF构成结构

01 WCF初识:WCF构成结构

www.MyException.Cn  网友分享于:2013-06-04  浏览:0次
01 WCF初识:WCF组成结构

在项目中总用到WCF,但是未曾去详细而深入得去了解。现重新阅读WCF全面解析上下册。谢谢博文以记心得。

望坚持。

使用WCF需要引用 System.ServiceModel.dll,而.NetFramwork版本需要3.0以上。

WCF组成结构:服务契约(Service Contract)、服务实体(Services)、宿主(Hosting)、客户端(Client)。

Contract:服务契约:定义WCF服务端与客户端之间的协定,通常以接口的形式实现,并使用[ServiceContract]进行服务协定定义,使用[OperationContract]进行服务公开协定;ServiceContract中还可以进行CallbackContractNameNamespace等特性赋值。OperationContract中还可以进行ActionIsOneWayName等特性赋值。

 1  [ServiceContract]
 2     public interface IDataProvider
 3     {
 4         /// <summary>
 5         /// 保存数据接口
 6         /// </summary>
 7         /// <param name="type">数据类型描述</param>
 8         /// <param name="data">数据的json格式</param>
 9         /// <returns>DataResult对象</returns>
10         [OperationContract]
11         string SaveData(string type, string data);
12     }

 

Services:继承Service Contract,并实现服务契约中所定义的方法。可以使用 ServiceBehavior(ServiceBehaviorAttribute)来指定服务协定实现的内部执行行为。

可进行特性赋值如:AddressFilterModeIncludeExceptionDetailInFaultsNameNamespace

1 [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
2     public partial class DataProvider : IDataProvider
3     {
4         public string SaveData(string type, string data)
5         {
6               //XXXX
7         }
8 
9     }

 

Hosting:宿主:WCF的运行是依赖于宿主的,是WCF服务运行的寄宿体,在System.ServiceModel.dll 中有System.ServiceModel.ServiceHost中可以实现该宿主功能。宿主主要有三部分构成:地址(Address)、绑定(Binding)、契约(Contract)。

  • 地址(Address):地址决定了服务的位置,解决了服务寻址的问题,《WCF技术剖析(卷1)》第2章提供了对地址和寻址机制的详细介绍;
  • 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等,《WCF技术剖析(卷1)》第3章提供对绑定的详细介绍;
  • 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。《WCF技术剖析(卷1)》第4章提供对服务契约的详细介绍。
  •  1             //WCF 使用Http实现WCF宿主
     2             Uri _uris = new Uri("http://127.0.0.1:3800");//WCF的地址
     3             ServiceHost _host = new ServiceHost(typeof(DataProvider), _uris);//初始化Host
     4             ContractDescription_contractDesc = ContractDescription.GetContract(typeof(IDataProvider));
     5             BasicHttpBinding httpBinding = new BasicHttpBinding();
     6 
     7             httpBinding.Name = "_HTTP_BINDING";
     8             httpBinding.MaxReceivedMessageSize = int.MaxValue;
     9             httpBinding.MaxBufferSize = int.MaxValue;
    10             httpBinding.ReaderQuotas.MaxArrayLength = int.MaxValue;
    11             httpBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
    12             httpBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
    13             httpBinding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
    14             httpBinding.SendTimeout = new TimeSpan(10, 10, 10);
    15             httpBinding.CloseTimeout = new TimeSpan(10, 10, 10);
    16             httpBinding.ReceiveTimeout = new TimeSpan(10, 10, 10);
    17             httpBinding.OpenTimeout = new TimeSpan(10, 10, 10);
    18             httpBinding.Security.Mode = BasicHttpSecurityMode.None;
    19             ServiceEndpoint _endpoint_http = new ServiceEndpoint(_contractDesc,
    20                                             httpBinding, new EndpointAddress(url));
    21             _host.Description.Endpoints.Add(_endpoint_http);
    22 
    23             ServiceMetadataBehavior _behavior = new ServiceMetadataBehavior();
    24             _behavior.HttpGetEnabled = true;
    25             _host.Description.Behaviors.Add(_behavior);
    26             _host.Open();//可使用host.Opened += delegate{LogHelper.Error("")}进行日志输出或其他操作。

    Client:客户端:当WCF服务成功寄宿到宿主后,可以便可通过代码生成工具(SvcUtil.exe)进行代理类生成,我们便可以通过这个代理类来实现对WCF服务的调用。

    通常情况调用契约的方法有两种:Client和Channel。(详细使用方法会在后续的文章中给出)

     1 //Client 访问方式
     2                 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
     3                 binding.MaxReceivedMessageSize = 5000000;
     4                 EndpointAddress address = new EndpointAddress(_hostUrl);
     5                 DataProviderClient client = new DataProviderClient(binding, address);//生成Client后即可使用定义的方法
     6                 //Channel访问方式
     7                 Uri _uris = new Uri(url);
     8                 EndpointAddress endpoint = new EndpointAddress(uri);
     9                 ContractDescription _contractDesc = ContractDescription.GetContract(Contract);
    10                 ChannelFactory<T> channelFactory = new ChannelFactory<T>(endpoint);
    11                 T instance = channelFactory.CreateChannel();

     

     暂时写到这里,各位大神,有任何问题 欢迎留言批评,指点。

     

     

     

     

    文章评论

    程序员应该关注的一些事儿
    程序员应该关注的一些事儿
    看13位CEO、创始人和高管如何提高工作效率
    看13位CEO、创始人和高管如何提高工作效率
    Web伟德国际app人员为什么越来越懒了?
    Web伟德国际app人员为什么越来越懒了?
    写给自己也写给你 自己到底该何去何从
    写给自己也写给你 自己到底该何去何从
    聊聊HTTPS和SSL/TLS协议
    聊聊HTTPS和SSL/TLS协议
    漫画:程序员的工作
    漫画:程序员的工作
    当下全球最炙手可热的八位少年创业者
    当下全球最炙手可热的八位少年创业者
    老美怎么看待阿里赴美上市
    老美怎么看待阿里赴美上市
    Google伦敦新总部 犹如星级庄园
    Google伦敦新总部 犹如星级庄园
    中美印日四国程序员比较
    中美印日四国程序员比较
    程序员的一天:一寸光阴一寸金
    程序员的一天:一寸光阴一寸金
    我的丈夫是个程序员
    我的丈夫是个程序员
    为啥Android手机总会越用越慢?
    为啥Android手机总会越用越慢?
    2013年美国伟德国际app者薪资调查报告
    2013年美国伟德国际app者薪资调查报告
    5款最佳正则表达式编辑调试器
    5款最佳正则表达式编辑调试器
    程序员周末都喜欢做什么?
    程序员周末都喜欢做什么?
    那些争议最大的编程观点
    那些争议最大的编程观点
    鲜为人知的编程真相
    鲜为人知的编程真相
    如何区分一个程序员是“老手“还是“新手“?
    如何区分一个程序员是“老手“还是“新手“?
    程序员必看的十大电影
    程序员必看的十大电影
    那些性感的让人尖叫的程序员
    那些性感的让人尖叫的程序员
    程序员和编码员之间的区别
    程序员和编码员之间的区别
    团队中“技术大拿”并非越多越好
    团队中“技术大拿”并非越多越好
    程序员都该阅读的书
    程序员都该阅读的书
    代码女神横空出世
    代码女神横空出世
    总结2014中国互联网十大段子
    总结2014中国互联网十大段子
    Java 与 .NET 的平台发展之争
    Java 与 .NET 的平台发展之争
     程序员的样子
    程序员的样子
    一个程序员的时间管理
    一个程序员的时间管理
    每天工作4小时的程序员
    每天工作4小时的程序员
    Java程序员必看电影
    Java程序员必看电影
    为什么程序员都是夜猫子
    为什么程序员都是夜猫子
    做程序猿的老婆应该注意的一些事情
    做程序猿的老婆应该注意的一些事情
    程序员的鄙视链
    程序员的鄙视链
    10个调试和排错的小建议
    10个调试和排错的小建议
    科技史上最臭名昭著的13大罪犯
    科技史上最臭名昭著的13大罪犯
    “懒”出效率是程序员的美德
    “懒”出效率是程序员的美德
    亲爱的项目经理,我恨你
    亲爱的项目经理,我恨你
    我是如何打败拖延症的
    我是如何打败拖延症的
    10个帮程序员减压放松的网站
    10个帮程序员减压放松的网站
    如何成为一名黑客
    如何成为一名黑客
    编程语言是女人
    编程语言是女人
    要嫁就嫁程序猿—钱多话少死的早
    要嫁就嫁程序猿—钱多话少死的早
    Web伟德国际app者需具备的8个好习惯
    Web伟德国际app者需具备的8个好习惯
    老程序员的下场
    老程序员的下场
    60个伟德国际app者不容错过的免费资源库
    60个伟德国际app者不容错过的免费资源库
    “肮脏的”IT工作排行榜
    “肮脏的”IT工作排行榜
    十大编程算法助程序员走上高手之路
    十大编程算法助程序员走上高手之路
    我跳槽是因为他们的显示器更大
    我跳槽是因为他们的显示器更大
    软件伟德国际app程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有