WCF 详解

一、什么是WCF?

​ .NET Framework 3.0 中开始引入一种专门用来构建分布式系统的API——WCF,与过去所有的其他分布式API(如DCOM,.NET Remoting,XML WebService,消息队列)有所不同,WCF提供统一的,可扩展的编程对象模型来使用以前多个分布式技术。

它是.NET 3.0 开始引入一种专门用来构建分布式系统的API。

前面我们学习了两种基于Web的服务:

1、Web Service

2、Web API

3、WCF

什么是分布式系统?

​ 分布式系统主要用于负载均衡,降低服务器的压力。就是对外是一个系统,但是实际上是将系统分别运行到不同的服务器上。

二、WCF体系框架

WCF统一了微软公司之前推出的多种分布式技术,其中包括:

  1. Web Service和WSE。
  2. .Net Remoting。
  3. .Net 企业服务。
  4. 微软消息队列(MSMQ)。

WCF的体系基本包含了4个方面,分别为契约、服务运行时、消息和寄宿。

1、契约(描述该服务的功能和作用,解释了该服务是做什么的)

​ 契约的定义描述了该服务的功能和作用,它告诉SOA系统中的其它节点这个服务是“做什么”的。

2、服务运行时 (定义服务时的具体行为,描述服务时怎么做的)

​ 服务运行时定义了服务在运行时的具体行为。如果说契约描述了服务是“做什么”的,那么服务运行时就在一定程度上描述了服务是“怎么做”的。

3、消息(消息的传输方式,消息的编码与解码)

​ 消息方面包含了消息的传输方式、消息的编码与解码。

4、激活和宿主

​ 激活和宿主属于WCF程序的部署方式。一个WCF服务需要在一个可运行的程序中寄宿,我们可以把宿主理解为WCF运行的容器。常用的寄宿方式包括自寄宿、IIS寄宿、Windows激活服务、Windows服务、Com+组件等。

三、WCF基础概念介绍

1、地址(Address)

​ 在WCF框架中,每个服务都具有唯一的地址。在SOA系统中,其它服务和客户端通过服务的地址来对服务进行访问。

http://localhost /Service
net.tcp://dc3web1:9023/MyService
net.msmq://localhost/MyMsMqService
实际上地址的形式不止这些,它们的构成形式如下所示:
http://[Hostname]:[Port]/[ServiceAddress]
https://[Hostname]:[Port]/[ServiceAddress]
net.tcp://[Hostname]:[Port]/[ServiceAddress]

2、绑定(Binding)

​ 绑定定义了服务与外部通信的方式。它由一组称为绑定元素的元素而构成,这些元素组合在一起形成通信基础结构。一个绑定可以包含以下内容。

  • 通信所使用的协议,如HTTP、TCP、P2P等。(什么样的协议通讯)
  • 消息编码方式,如纯文本、二进制编码、MTOM等。(通信的方式)
  • 消息安全保障策略。(保障消息不被窃取)
  • 通信堆栈的其它任何要素。(其他要素)

3、契约(Contract)

1、服务契约[ServiceContract]

​ 服务契约将多个相关的操作联系在一起,组成单个功能单元。

不需要关心单元的细节,只需要关心单元的使用。

2、数据契约[DataContract]

​ 数据类型的说明称为数据契约。服务使用的数据类型必须在元数据中进行描述,以使其它各方面可以与该服务进行交互操作。

3、错误契约[FaultContract]

​ 错误类型的说明称为错误契约。

4、消息契约[MessageContract]

​ 消息契约描述消息的格式。

4、终节点(EndPoint)

	终结点是用来发送或接收消息(或同时执行这两种操作)的构造。一个终节点由三个要素组成,分别是笔者已经介绍了的:地址、绑定和契约。以SOA的思想来看,一个终节点就相当于服务的公共接口。

5、元数据

​ 描述服务的特征,外部实体需要了解这些特征,服务公开的元数据包括有XML结构的文档(定义服务的数据协定)和WSDL文档(描述服务的方法)。

6、宿主

​ 服务必须承载于某个进程中,宿主是控制服务的生存期的应用程序。

四、构建WCF服务

WCF示例:

​ 1、创建“WCF服务库”,在菜单中选择“文件(F)”->“新建项目§…”打开新建项目对话框。在左侧的“项目类型”中选择“WCF”,然后再在右侧的“模板”中选择“WCF服务库”,如图7-1所示。在“名称”文本框中,填写我们要创建的WCF服务库的项目名称“WCF_HelloWorld”。

image-20200423181557127

​ 2、点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。

image-20200423181641109

​ 3、修改IService1.cs接口中的内容如下。WCF服务接口标记了[ServiceContract]特性,每个接口成员都标注[OperationContract]特性,服务接口中可以包含不标注特性的方法,这就表示该方法不会被WCF运行库公开。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string HelloWorld(string name);
}

​ 4、修改Service1.cs类中的内容如下,继承IService1接口实现接口中定义的HelloWorld方法。

public class Service1 : IService1
{
    public string HelloWorld(string name)
    {
        return name + "说:HelloWord";
    }
}

​ 5、点击启动按钮,或在菜单中选择“调试”->“启动调试F5”,启动WCF测试客户端。如图7-3所示。在窗口左侧显示我的服务项目相关信息,第一个行服务地址:

http://localhost:8733/Design_Time_Addresses/WCF_HelloWorld/Service1/mex

​ 6、下面式具体的提供的服务,在窗口右侧显示的是服务的使用说明,描述了如何给WCF测试客户端添加新的服务地址,以及如何测试服务的流程步骤。

image-20200423181932697

​ 7、双击HelloWorld服务,可以显示服务请求界面,在名称name的值中填写内容,并调用HelloWorld服务。

image-20200423182020436

8、调用后在响应窗口中显示返回值”Jack说:HelloWord”。

image-20200423182049448

注意:

构建WCF服务类型时并不需要使用接口,可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的,但是使用接口会有很多好处,其中最大达好处就是可扩展性,灵活性很高,而且这也是目前流行的。

​ 构建WCF服务类型并不需要使用接口。可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的。

​ 虽然这种方式也可以构建WCF服务,但是显式方式定义一个接口类型来描述服务契约的好处很多。

​ 例如接口可以应用到多个服务类型,这些服务类型可以是用多种语言和架构实现的,使用接口可以获得更大的灵活性,此外服务契约接口可以作为新契约的基础,可是实现接口继承的方式来扩展接口服务。

当前代码无法直接执行还需要修改App.config配置文件配合,在后续会介绍。

接口定义了规范,不定义实现。

[ServiceContract]
public class Service1 //: IService1
{
    [OperationContract]
    public string HelloWorld(string name)
    {
        return name + "说:HelloWord";
    }
}

五、使用WCF数据契约实现模型数据交互

示例:

​ 1、接上一个项目,在项目中添加一个类存储实体数据,命名为User。

​ 定义服务契约将自定义类型作为参数或返回值时就需要使用WCF数据契约,对这些数据进行建模,数据契约是使用[DataContract]特性的类型,以及每一个需要作为契约一部分的属性也需要标记[DataMember],使用这个特性需要引用命名空间System.Runtime.Serialization

using System.Runtime.Serialization;
[DataContract]
//注意这里的类一定要是公开的
public class User
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
}

​ 2、在IService1接口中,添加两个WCF服务方法。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string HelloWorld(string name);
    //添加用户名称和年龄
    [OperationContract]
    void AddUser(string name, int age);
    //显示所有已经添加的用户
    [OperationContract]
    List<User> GetUsers();
}

​ 3、在Service1类中创建WCF服务方法,AddUser服务接收提交数据,保存到List集合中,GetUsers服务返回所有提交的用户集合,给Service1类加上特征设置InstanceContextMode.Single,表明当前服务为所有服务请求生成唯一服务对象,这样每个请求所访问的List集合就是公共的。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
    List<User> list = new List<User>();
    public string HelloWorld(string name)
    {
        return name + "说:HelloWord";
    }
    public void AddUser(string name, int age)
    {
        list.Add(new User { Name = name, Age = age });
    }
    public List<User> GetUsers()
    {
        return list;
    }
}

运行效果:

AddUser:服务提交数据

image-20200426103424975

GetUsers:服务获取所有用户数据

image-20200426103512677

六、实战演练——创建新闻查询WCF服务

1、任务目标:

  • 创建WCF服务实现添加新闻数据
  • 创建WCF服务实现新闻标题查询

2、需求说明

  • 连接新闻数据库实现添加新闻数据服务。
  • 连接新闻数据库实现新闻标题查询。

3、实现思路

  1. 创建WCF服务库。
  2. 添加LINQ to SQL类,链接数据库,添加News表到LINQ to SQL类中。
  3. 编写WCF服务接口IService.cs。
  4. 编写WCF服务Service.cs。
  5. 启动WCF客户端工具测试服务。
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        // TODO: 在此添加您的服务操作
        [OperationContract]
        void addNews(string title, string content, int categoryid);

        [OperationContract]
        List<News> GetNews(string key);
        
        [OperationContract]
        List<News> GetNewsByAll();

        [OperationContract]
        void DeleteNewsByNewsID(int id);
        
        [OperationContract]
        void ModifyNewsByNewsId(int id, string title, string content, int CategoryID);
        
    }
    public class Service1 : IService1
    {
        NewsDataContext db = new NewsDataContext();
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public void addNews(string title,string content,int categoryid)
        {
            News news = new News();
            news.Title = title;
            news.Content = content;
            news.CategoryID = categoryid;
            db.News.InsertOnSubmit(news);
            db.SubmitChanges();
        }

        public List<News> GetNews(string key)
        {
            return db.News.Where(m => m.Title.Contains(key)).ToList();
        }
        
        public List<News> GetNewsByAll()
        {
            return db.News.ToList();
        }

        public void DeleteNewsByNewsID(int id)
        {
            News news = db.News.Where(m => m.NewsID == id).FirstOrDefault();
            db.News.DeleteOnSubmit(news);
            db.SubmitChanges();
        }
        
        public void ModifyNewsByNewsId(int id, string title, string content, int CategoryID)
        {
            News news = db.News.Where(i => i.NewsID == id).FirstOrDefault();
            news.Title = title;
            news.Content = content;
            news.CategoryID = CategoryID;
            db.SubmitChanges();

        }
        
    }

AddNews:添加新闻数据

image-20200426105911482

GetNews:新闻标题查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A62RriE1-1616160593528)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-20200426105950759.png)]

GetNewsByAll:获取所有新闻

image-20200426110909376

DeleteNewsByNewsID:根据ID删除新闻

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcaaXqAu-1616160593530)(C:\Users\yaote\AppData\Roaming\Typora\typora-user-images\image-20200426111130673.png)]

ModifyNewsByNewsId:修改新闻数据

image-20200426111807348

七、小结

  • 本小结中我们学习了WCF是一种用来构建分布式系统的API。
  • WCF为程序员提供了丰富的功能,其中包括:托管、服务实例管理、异步、安全、事务管理、离线队列等。
  • WCF的体系框架包含了4个方面,分别为契约、服务运行时、消息和寄宿。
  • 构建WCF服务类型并不需要使用接口。可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的。但是使用接口可以获得更大的灵活性。
  • 构建WCF服务类型时并不需要使用接口,可以直接将[ServiceContract]特性和[OperationContract]特性应用到服务类上也是可以的,但是使用接口会有很多好处,其中最大达好处就是可扩展性,灵活性很高,而且这也是目前流行的。
  • 23
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
WCF WebSocket是WCF 4.5中新增的一个功能,它支持在WCF中使用WebSocket协议进行通信。WebSocket是一种全双工通信协议,可以在客户端和服务器之间建立持久性的连接,实现实时的双向通信。\[1\] 然而,需要注意的是,WCF WebSocket只在Windows 8及以上的系统中支持,对于Windows 7等旧版本的系统则不支持。这是因为WCF WebSocket依赖于System.Net.WebSocket类,而该类也只在Windows 8及以上的系统中可用。\[2\] 在WCF中,可以使用NetHttpBinding和NetHttpsBinding这两个标准绑定来支持WebSocket传输。这两个绑定允许在标准的HTTP端口80和443上进行WebSocket通信,从而可以通过Web中介进行跨网络的通信。\[3\] 总结起来,WCF WebSocket是WCF 4.5中新增的功能,它支持使用WebSocket协议进行实时的双向通信。然而,需要注意的是,WCF WebSocket只在Windows 8及以上的系统中支持,并且可以使用NetHttpBinding和NetHttpsBinding这两个标准绑定来进行WebSocket通信。 #### 引用[.reference_title] - *1* *2* [在WCF中使用websocket](https://blog.csdn.net/weixin_34205826/article/details/85568070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [WCF websocket](https://blog.csdn.net/weixin_30699741/article/details/96370576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值