




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WCF 培训讲稿培训讲稿 2 1SOA 架构介绍架构介绍 4 1 1什么是 SOA 4 1 2SOA 的 4 个特性 4 2WCF 简要介绍简要介绍 4 2 1什么是 WCF 4 2 2 Net Framework 的四大体系架构 5 2 3WCF 体系框架 6 2 4WCF 基础概念介绍 7 3第一个第一个 WCF 程序程序 8 3 1HelloWord 服务契约的定义 8 3 2数据契约的定义 8 4WCF 消息交换模式消息交换模式 9 4 1数据报模式 One Way Calls 9 4 2请求 响应模式 Request Reply 10 4 3双工模式 Duplex 10 5WCF 绑定绑定 10 5 1标准绑定 11 5 2设置绑定的方式 12 6WCF 契约契约 13 6 1契约的定义和分类 13 6 1 1什么是契约 13 6 1 2契约的分类 13 6 2服务契约 13 6 3数据契约 13 6 4错误契约 14 6 4 1WCF 中默认的异常处理 14 6 4 2WCF 中的 FaultException 15 6 4 3WCF 中的 FaultContractAttribute 16 6 5消息契约 17 7WCF 中的行为中的行为 17 7 1实例控制 18 7 1 1实例管理的设置 18 7 1 2PerSession 实例策略 18 7 1 3PerCall 实例策略 19 7 1 4Single 实例策略 19 7 2并发控制 20 7 2 1并发管理的设置 20 7 2 2Single 并发模式 20 3 7 2 3Multiple 并发模式 20 7 2 4Reentrant 并发模式 20 7 3元数据发布 21 7 3 1HTTP GET 方式发布元数据 21 7 3 2MEX 终节点方式发布元数据 22 4 1 SOA 架构介绍架构介绍 1 1 什么是什么是 SOA 近几年来 SOA 无疑是 IT 界最为火热的技术之一 SOA 的全称是面向服务架构 Service Oriented Architecture 它属于一种组件架构模型 它 可以根据需求对松散耦合的粗粒度应用组件进行分布式部署 组合和使用 服务是 SOA 的 基础 可以直接被使用 从而有效控制系统中与软件代理交互的人为依赖性 1 2 SOA 的的 4 个特性个特性 SOA 并没有限定具体的实现技术 但总结来说 一个合格的 SOA 系统需要至少拥有下列 4 个特性 1 每个服务具有明确的服务边界 所谓服务边界 是指服务的公共接口与其内部专用实现之间的界限 明确的服务边界使得 服务与位置和技术无关 换句话说 客户端无法知道服务实现的技术 地理位置和运行平 台 2 服务是独立的 3 采用标准的契约定义和通信协议 SOA 系统的特点之一就是允许每个服务使用各自的技术和平台来实现 在这种情况下要求 服务之间可相互交互 就势必要求服务的契约定义和通信协议都是行业标准的 任何特定 技术平台的协议都不适合用在 SOA 系统之上 4 服务是自解释的 这个是又 W3C 定义的 根据 W3C 对 SOA 系统的定义 服务的内容必须是自解释的 也 就是说 服务必须以某种标准的方式告诉整个 SOA 系统该服务提供的功能 2 WCF 简要介绍简要介绍 2 1 什么是什么是 WCF WCF 的全称是 Windows Communication Foundation 从本质上来说 它是一套软件开发 包 是微软公司推出的符合 SOA 思想的技术框架 WCF 为程序员提供了丰富的功能 其中包括 托管 服务实例管理 异步 安全 事务管 理 离线队列等 并且 WCF 对产业中的标准协议进行了封装和定义 它把程序员从繁琐 的通信 格式编码中解放出来 使得程序员能够专注于业务逻辑的实现 同时 WCF 统一 了微软公司之前推出的多种分布式技术 其中包括 1 Web 服务和 WSE 5 2 Net Remoting 3 Net 企业服务 4 微软消息队列 MSMQ WCF 对这些技术的集成包括两个方面 1 WCF 的架构本身吸取了这些技术的精华 2 WCF 开发的服务 客户端可以和现有的 Web 服务 MSMQ 程序进行交互 2 2 Net Framework 的四大体系架构的四大体系架构 Net Framework 的四大体系包括 WCF WF WPF WCS WCF Windows Communication Foundation 主要是用来做松耦合的分布式通讯的 它还 有另外一个名字叫 Indigo 是微软迈向 SOA 一个重要的标志 WCF 是 Net Framework 的 一个子集 WF Windows Wordflow Foundation 工作流引擎 WPF Windows Presenttation Foundation WPF 使用矢量绘图引擎 提供了一种声明式编 程语言 XAML 用来开发具有炫目视觉效果的应用程序 WCS Windows Card Space 采用了一种新的数字标识技术来实现类似网银单点登录的 功能 主要用来防止钓鱼式攻击等 从网络安全方面提供了一个保障 6 2 3 WCF 体系框架体系框架 从图上来看 WCF 的体系基本包含了 4 个方面 分别为契约 服务运行时 消息和寄宿 1契约 能干什么 从 SOA 的概念上来看 契约属于一个服务公开接口的一部分 一个服务的契约 定义了服 务端公开的服务方法 使用的传输协议 可访问的地址 传输的消息格式等内容 基本上 契约的定义描述了该服务的功能和作用 它告诉 SOA 系统中的其它节点这个服务 是 干什么 的 2服务运行时 怎么干 服务运行时定义了服务在运行时的具体行为 如果说契约描述了服务是 干什么 的 那 么服务运行时就在一定程度上描述了服务是 怎么干 的 3消息 消息方面包含了消息的传输方式 消息的编码与解码 消息方面的内容基本属于服务边界 以内的具体实现 具体的传递时限 必须符合在契约中定义的绑定协议 7 4激活和宿主 在哪干 激活和宿主属于 WCF 程序的部署方式 一个 WCF 服务需要在一个可运行的程序中寄宿 我们可以把宿主理解为 WCF 运行的容器 常用的寄宿方式包括自寄宿 IIS 寄宿 Windows 激活服务 Windows 服务 Com 组件等 根据 SOA 的原则 激活和宿主类型的 变化不会影响服务本身的特性和外部对该服务的访问 而 WCF 在这一方面也确实做的非 常出色 2 4 WCF 基础概念介绍基础概念介绍 WCF 框架中包含了大量的基础概念 本小节将以简短的篇幅带领大家浏览这些概念 使大 家能够对 WCF 的基本概念有所了解 1 地址 Address 在 WCF 框架中 每个服务都具有唯一的地址 在 SOA 系统中 其它服务和客户端通过服 务的地址来对服务进行访问 一个服务的地址由一个统一资源标示符 URI 来表示 下 面是几个地址示例 http localhost 80 Service net tcp dc3web1 9023 MyService net msmq localhost MyMsMqService 实际上地址的形式不止这些 它们的构成形式如下所示 http Hostname Port ServiceAddress https Hostname Port ServiceAddress net tcp Hostname Port ServiceAddress net pipe Hostname Port ServiceAddress net msmq Hostname public private QueueName msmq formatname msmq format name 2 绑定 Binging 绑定定义了服务与外部通信的方式 它由一组称为绑定元素的元素而构成 这些元素组合 在一起形成通信基础结构 一个绑定可以包含以下内容 1 通信所使用的协议 如 HTTP TCP P2P 等 2 消息编码方式 如纯文本 二进制编码 MTOM 等 3 消息安全保障策略 4 通信堆栈的其它任何要素 3 契约 Contract 在 2 3 节中 笔者已经介绍了契约的基本概念 在 WCF 中一共包含了 4 种契约 分别是服 务契约 数据契约 错误契约和消息契约 1 服务契约 ServiceContract 服务契约将多个相关的操作联系在一起 组成单个功能单元 2 数据契约 DataContract 数据类型的说明称为数据契约 服务使用的数据类型必须在元数据中进行描述 以使其它 各方面可以与该服务进行交互操作 3 错误契约 FaultContract Comment w1 这里需要添加对 ServiceModel 的引用 8 错误类型的说明称为错误契约 4 消息契约 MessageContract 消息契约描述消息的格式 5 终节点 EndPoint 终结点是用来发送或接收消息 或同时执行这两种操作 的构造 一个终节点由三个要素 组成 分别是笔者已经介绍了的 地址 绑定和契约 以 SOA 的思想来看 一个终节点就 相当于服务的公共接口 6 元数据 服务的元数据描述服务的特征 外部实体需要了解这些特征以便与该服务进行通信 服务 所公开的元数据包括 XML 架构文档 用于定义服务的数据协定 和 WSDL 文档 用于描 述服务的方法 启用元数据后 WCF 通过检查服务及其终节点自动生成服务的元数据 在 WCF 的行为章节中 笔者将介绍两种 WCF 的元数据发布方式 7 宿主 服务必须承载于某个进程中 宿主是控制服务的生存期的应用程序 3 第一个第一个 WCF 程序程序 在了解了 WCF 的基本概念以后 本节将按照程序员学习新技术的习惯 给出一个简单的 服务契约的 HelloWord 实例跟一个数据契约的实例 3 1 HelloWord 服务契约的定义服务契约的定义 using System ServiceModel ServiceContract public interface IService1 OperationContract string HelloWord string name public class Service1 IService1 public string HelloWord string name return name 说 HelloWord Demo1 服务契约 Comment w2 这里需要添加对 ServiceModel 的引用 Comment w3 因为涉及对象的序列 化 这里需要添加此项命名空间以序 列化对象 Comment w4 这里有个小知识点需 要让大家了解 9 3 2 数据契约的定义数据契约的定义 using System ServiceModel using System Runtime Serialization DataContract public class People DataMember public string name DataMember public int age public People string name int age this name name this age age ServiceContract public interface IService1 OperationContract string GetInfomation People people Demo2 数据契约 知识点 通过自寄宿在服务器端模拟客户端 4 WCF 消息交换模式消息交换模式 WCF 客户端与服务器之间是通过消息进行通讯 了解 WCF 的消息交换模式有助于大家对 消息的发送和接受由更直观的理解 在 WCF 中 有三种消息交换模式 数据报模式 请 求 响应模式 双工模式 4 1 数据报模式 数据报模式 One Way Calls 数据报模式指的是发送端负责把消息发送给对方并且收到确认消息之后 就完成交互的方 式 在这种模式下 发送方唯一能确定的就是消息发送成功 而对于消息是否最终到达服 务的终节点 是否被成功处理 发挥的结果如何都一无所知 数据报模式存在以下特点 1 返回类型只能是 void Comment w5 回调接口 客户端需 要继承自这个接口并且实现这个接口 的方法 Comment w6 为了防止死锁 我们 将回调设置为单程操作 Comment w7 这里通过 CallbackContract 属性指定契约的回调接 口 10 2 不能包含 ref 或者 out 类型的参数 3 只有客户端发起请求 服务端并不会对请求进行回复 通过设置 OperationContract 的 IsOneWay True 可以将消息模式设置为数据报模式 具体方 法如下 OperationContract IsOneWay true void Test Demo3 数据报模式与请求 响应模式 4 2 请求请求 响应模式 响应模式 Request Reply 在请求响应模式中 客户端发送一个消息并且接收一个返回消息来完成一次交互 在该模 式中 消息的发起端必然是客户端 并且从服务端返回只有一条消息 客户端在发送出消 息后会阻止当前线程并且等待服务端返回消息 请求响应模式是缺省的消息交换模式 类似于 HTTP 协议中的请求 响应模型 这种消息交 换模式是使用最多的一种 请求 响应模式有如下特点 1 调用服务方法后需要等待服务的消息返回 2 在这种模式下 服务端永远是服务端 客户端就是客户端 职责分明 它是缺省的消息交换模式 设置 OperationContract 便可以设置为此种消息交换模式 方法 如下 OperationContract void Test Demo3 数据报模式与请求 响应模式 4 3 双工模式 双工模式 Duplex 在双工模式中 客户端和服务端都可以任意地向对方发送消息 而对方也可以以任意的次 序来接收消息 在这种模式下 发送端和接收端的概念变得不再适用 取而代之的是通信 的两个端点 这种模式相对较复杂一些 服务端的契约定义如下所示 public interface ICallBack OperationContract IsOneWay true void UpdateInterval int seconds ServiceContract CallbackContract typeof ICallBack public interface IService1 OperationContract void Heartbeat Demo4 双工模式 11 5 WCF 绑定绑定 绑定的本质是一个配置好的通道栈 为了方便程序员专注于业务逻辑 WCF 提供了一系列 常用的绑定 5 1 标准绑定标准绑定 在 NET Framework 3 5 中 WCF 一共提供了 12 种标准绑定 这些绑定基本能够覆盖用户所 有的传输要求 表 5 1 12 种标准绑定简要说明 绑定名称绑定名称简要介绍简要介绍所需所需 Net Framework 版本版本 basicHttpBinding基于 WS I Basic Profile 1 1 的 Web 服务 3 0 wsHttpBinding针对改进的 Web 服务的绑定 包括 WS Security WS Transaction 等元 素 3 0 wsDualHttpBinding提供双工通信的 HTTP 绑定3 0 webHttpBinding支持 REST POX 服务的绑定 使用 XML JSON 序列化 3 0 netTcpBinding使用 TCP 传输协议在跨主机的局域 网内使用 支持可靠性 事务 安 全等特性 并且该绑定被特别优化 来支持 WCF 系统 但是 使用该绑 定需要确保通信双方都基于 WCF 构 建 这里并不符合 SOA 的原则 3 0 netNamedPipeBinding支持和 netTcpBinding 大致相同的特 性 但由于使用命名管道进行通信 所以通信不能跨越主机 3 0 netMsmqBinding使用微软消息队列 MSMQ 协议 来进行异步脱机的消息交互 关于 该绑定的交互方式 在本书的后续 章节中有详细的介绍 3 0 netPeerTcpBinding使用 P2P 协议在网格中进行消息交 互 3 0 msmqIntegrationBinding该绑定可以用来在 WCF 消息和 MSMQ 消息中进行转换 3 0 wsFederationHttpBinding该绑定支持使用了联合安全机制的 Web 服务 3 0 ws2007HttpBinding该绑定继承自 wsHttpBinding 其主 要涉及目的是为了支持 2007 年新制 定的 WS 标准 3 5 Comment w8 地址 Comment w9 绑定 Comment w10 契约 Comment w11 构造绑定 Comment w12 构造终节点 12 ws2007FederationHttpBinding该绑定继承自 wsFederationHttpBinding 和 wsHttpBinding 一样 其设计目的是 为了支持 2007 年新制定的 WS 标准 3 5 5 2 设置绑定的方式设置绑定的方式 在 WCF 程序中 有两种方式来设置绑定 在代码中设置绑定和在配置文件中设置绑定 一般来说 在配置文件中设置绑定更为常用 这是因为绑定的设置常常需要根据部署环境 的改变而改变 1 在配置文件中设置绑定 2 在代码中设置绑定 using System ServiceModel using System ServiceModel Channels NetNamedPipeBinding binding new NetNamedPipeBinding EndpointAddress address new EndpointAddress new Uri net pipe localhost HelloWorld using HelloWorldProxy proxy new HelloWorldProxy Console WriteLine proxy HelloWorld Kevin 利用代理调用服务 Console Read Comment w13 建议设置服务契约的 Name 和 Namespace 这样可以方便 我们进行代码的重构 13 6 WCF 契约契约 6 1 契约的定义和分类契约的定义和分类 6 1 1 什么是契约什么是契约 在 2 3 节中 笔者已经介绍了契约的基本概念 契约 Contract 是 WCF 的消息标准 告知客户端如何与服务器联系交互 一般情况下 我 们用接口 Interface 来定义服务契约 Service Contract 6 1 2 契约的分类契约的分类 在 WCF 中一共包含了 4 种契约 分别是服务契约 数据契约 错误契约和消息契约 6 2 服务契约服务契约 在第 3 节中 笔者已经针对服务契约和数据契约做过两个 Demo 因此服务契约和数据契 约本节不做重点 下面来看下服务契约都有哪些属性 ServiceContract ConfigurationName 其设置信息在配置文件中的名称 Name Namespace 自定义该服务契约的名称和命名空间 SessionMode 设置服务契约的 Session 方式 包括 Allowe NotAllowed Required CallbackContract 设置 duplex 模式时的回调类型 ProtectionLevel 指定消息保护方式 可以对消息进行加密和签名处理 OperationContract AsyncPattern 用于定义异步服务方法 IsInitiating 指示服务方法能否启动一个 Session IsTerminating 指示服务方法调用完成是否结束 Session 6 3 数据契约数据契约 在第 3 节中 笔者已经针对服务契约和数据契约做过两个 Demo 因此服务契约和数据契 约本节不做重点 下面来看下数据契约都有哪些属性 DataContract Name Namespace 自定义名称和命名空间 DataMember 14 Name 自定义名称 IsRequired 指示该成员序列化前必须被赋值 6 4 错误契约错误契约 在 WCF 中消息首先会被序列化为 SOAP 消息再进行发送 也就是说 所有的数据都包含 在 SOAP 消息中 包括异常信息 SOAP 规定了异常消息的携带方式 那就是全部放入 Fault 节点中 Fault 节点必须是 Body 节点的子节点 同时 一个 SOAP 消息中只能出现一 个 Fault 节点 表 6 1 Fault 的子节点 子节点子节点描述描述 供识别故障的代码 可包含两个子节点 Code 和 Subcode 可供人阅读的有关故障的说明 可选 指向 SOAP 消息中引发错误的节点 可选 发生错误时节点所处的角色 可选 包含了详细的错误信息 说明 无论是使用哪种错误方式 WCF 系统最终会把错误信息放入 Fault 节点中进行传输 6 4 1 WCF 中默认的异常处理中默认的异常处理 WCF 将服务异常 Exception 转换成 SOAP faults 传递到客户端后再次转换成 Exception 只不过缺省情况下 我们很难从中获取有意义的信息 ServiceContract public interface IService1 OperationContract int Add int a int b public class Service1 IService1 public int Add int a int b throw new Exception 错误 异常信息如下所示 Unhandled Exception System ServiceModel FaultException The server was unable t o process the request due to an internal error For more information about the error either turn on IncludeExceptionDetailInFaults either from ServiceBehavio rAttribute or from the configuration behavior on the server in o rder to send the exception information back to the client or turn on tracing as per the Microsoft NET Framework 3 0 SDK documentation and inspect the server t 15 race logs Server stack trace at System ServiceModel Channels ServiceChannel ThrowIfFaultUnderstood Message reply MessageFault fault String action MessageVersion version FaultConverte r faultConverter at System ServiceModel Channels ServiceChannel HandleReply ProxyOperationRunt ime operation ProxyRpc 这次输出信息要有好的多 异常信息如下所示 Unhandled Exception System ServiceModel FaultException 异常测试 Server stack trace at System ServiceModel Channels ServiceChannel HandleReply ProxyOperationRunt ime operation ProxyRpc DataContract public class FaultMessage DataMember public string Message DataMember public int errorCode public class Service1 IService1 Comment w14 定义消息协定 Comment w15 Header 部分的成员 Comment w16 Body 部分的成员 17 public int Add int a int b FaultMessage faultMessage new FaultMessage faultMessage Message 错误信息 faultMessage errorCode 1234 throw new FaultException faultMessage faultMessage Message 客户端的异常信息 Unhandled Exception System ServiceModel FaultException 1 Client ServiceReferenc e1 FaultMessage 错误信息 Fault Detail is equal to Client ServiceReference1 Fa ultMessage 注意 由于单程操作没有任何返回值 也不回把任何错误发还给客户端 所以不能在单程 操作上使用错误契约 不然会导致运行时异常 6 5 消息契约消息契约 使用数据契约已经足以应付消息交互双方对数据内容的所有要求 但是对消息的格式却无 法全面控制 如果想要定制 SOAP 消息的 Head 和 Body 内容 这就需要定制 SOAP 消息的 Head 和 Body 内容 这就需要用到消息契约 消息契约在实际 WCF 编程中使用的并不多 本节不做详细讨论 只给出一个简单的示例 MessageContract public interface MyMessage MessageHeader public int SessionId MessageHeader public string Description MessageBodyMember public string A MessageBodyMember public string B MessageBodyMember public string C 说明 消息中包含 Header 跟 Body 两部分 Header 用来存放上下文信息 Body 用来存 放数据信息 7 WCF 中的行为中的行为 行为 Behaviors 指的是那些影响 WCF 系统运行的设置 行为在宿主和客户端启动后发 Comment w17 PerSession 实例策略 Comment w18 PerCall 实例策略 Comment w19 Single 实例策略 Comment w20 设置实例策略为 Persession 18 挥作用 WCF 系统中行为包括服务行为 Service Behavior 和操作行为 Operation Behavior 服务行为作用在终节点上 常见的服务行为包括实例控制 并发控制 元数据 发布等 操作行为作用于某一服务操作上 常见的操作行为包括事务流设置等 7 1 实例控制实例控制 当服务端接收到客户端的调用之后 需要把该消息发送到具体的服务实例上 实例管理 就是和所有实例的分配 管理有关的技术统称 实例管理属于服务行为的一种 本节将简 要介绍下实例管理 7 1 1 实例管理的设置实例管理的设置 所有的服务行为都通过 ServiceBehavior 特性来进行设置 实例管理业不例外 实例管理通 过 ServiceBehavior 特性的 InstanceContextMode 属性进行设置 该属性的类型为 InstanceContextMode 枚举类型 枚举类型定义如下 public enum InstanceContextMode PerSession 0 PerCall 1 Single 2 下面将通过一个例子来演示如何为服务类型配置实例策略 using System ServiceModel ServiceContract public interface IService1 OperationContract string HelloWord string name ServiceBehavior InstanceContextMode InstanceContextMode PerSession public class Service1 IService1 public string HelloWord string name return name 说 HelloWord 7 1 2 PerSession 实例策略实例策略 PerSession 是默认的实例策略 PerSession 代表了会话的实例管理模式 会话管理模式相对 较为负责 仅仅设置服务行为是不够的 需要满足一下 3 个方面才能在客户端和服务端之 19 间建立会话 这 3 个方面是 1 服务契约的会话设置 2 服务行为的实例模式设置 3 绑定的选择 7 1 2 1服务契约的会话设置服务契约的会话设置 服务契约的会话设置通过 ServerContract 的 SessionMode 属性进行设置 SessionMode 属性 是枚举类型 SessionMode 定义如下 public enum SessionMode Allowed 0 Required 1 NotAllowed 2 服务契约的 SessionMode 设置如下所示 ServiceContract SessionMode SessionMode Allowed public interface IService1 OperationContract string HelloWord string name 7 1 2 2服务行为的实例模式设置服务行为的实例模式设置 这里没有太多可讨论的话题 为了使用会话模式 实例模式必须设置为 PerSession 7 1 2 3绑定的选择绑定的选择 绑定的选择需要注意的就是绑定是否支持会话 如 basicHttpBinding 则无法应用于会话实 例管理模式 7 1 3 PerCall 实例策略实例策略 当服务端采用了 PerCall 实例策略后 每个客户端的请求消息都会被分发到一个新的服务实 例上 而一旦这个调用返回后 服务实例则会被销毁 Comment w21 当有多个客户端试图 同时访问服务操作时 这些请求会被 放入一个排队队列之中 并且依次进 入服务实例操作 在排队过程中一旦 某个请求超时 则该客户端将会得到 一个 TimeoutException 异常 20 7 1 4 Single 实例策略实例策略 Single 实例策略非常类似设计模式中的单件模式 所有的客户端代理发送的消息都会被应 用到同一个服务实例上 7 2 并发控制并发控制 并发的概念也可以理解为多线程 在 WCF 中 并发也属于一种服务行为 7 2 1 并发管理的设置并发管理的设置 和实例管理一样 并发管理业通过服务行为的属性来设置 并发管理的属性名为 ConcurrencyMode 它的类型是枚举类型 该定义类型如下 public enu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论