ASPNETWebService开发显浅教材_第1页
ASPNETWebService开发显浅教材_第2页
ASPNETWebService开发显浅教材_第3页
ASPNETWebService开发显浅教材_第4页
ASPNETWebService开发显浅教材_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ERPX-20130604ASP.NET WebService开发显浅教材作者:Actul课程目标:1. 学会创建.net解决方案。2. 学会创建简单ASP.NET Web工程项目及Windows Form应用工程项目。3. 了解WebService概念,学会在Web工程中加入Web服务。4. 学会在WinForm应用项目中调用WebService的方法(HelloWorld)。5. 了解三层结构概念,学会在WebService中加入读取数据的方法(OpenData)。6. 学会在WinForm应用项目(客户端程序)中调用WebService的读数方法并显示在界面中。7. 学会在WebServ

2、ice中加入保存数据的方法(SaveData)。8. 学会将开发完成的WebService服务发布到IIS服务器,调整客户端程序连接到IIS的WebService。实习环境:操作系统:Windows 7 ,32位或64位,启用IIS 7.0。开发环境:Visual Studio 2010。数 据 库: 本机SQL Server 2008(Express或其它版本),挂上Northwind示例数据库。为能跟随本教程进行实习,请按上述配置建立上机实习环境。若你的本机数据库系统没有Northwind示例数据库,请从下列网址下载: 本教材各章节相应随附源代码,双击打开附件后解压到你习惯的目录即可。一、

3、 创建.net解决方案本教程要示例开发WebService项目 及 Winform Application项目,为便于调试,通常将相关工程放在一起管理,在VS中称为解决方案。要在VS中创建解决方案,请依下列步骤:文件 > 新建 > 项目,找到并展开其它项目类型,到达下图:选中Visual Studio 解决方案,将解决方案命名为:WebSvcSample。位置在本机选择一个合适目录并选中或直接填上。点确定后,IDE右边【解决方案资源管理器】即显示一个空白的解决方案。如果这时就加入新项目,结果解决方案资源管理器只显示刚加入的单个项目,不能再加入另一个项目,这是VS怪诞的地方。鼠标右键

4、选中解决方案' WebSvcSample', > 添加 > 新建解决方案文件夹。添加一个空白的解决方案文件夹后,再加入工程项目,【解决方案' WebSvcSample'】才不会消失,接着可加入其它的工程。有两个以上工程项目后,可删除刚才加入的“空白的解决方案文件夹”,不会影响解决方案的显示。至此,一个空白解决方案已经创建完成。下面的任务是要创建两个工程项目,一个是空白Web应用程序(用来建立WebService),另一个是空白的Windows窗体应用程序(用来建立客户端应用程序)。二、 添加Web应用程序及Windows窗体应用程序鼠标右键选中解决方

5、案' WebSvcSample', > 添加 > 新建项目 > 在对话框左侧已安装的模板,展开Visual C#项。选中Web,右侧区域列出相关模板,选中ASP.Net 应用程序。下边名称输入:WebSvc1。【v】为解决方案创建目录,需打上勾。点右下方确定 ,即创建一个Web空白应用程序。同样步骤,鼠标右键选中解决方案' WebSvcSample', > 添加 > 新建项目 > 在对话框左侧已安装的模板,展开Visual C#项。选中Windows,右侧区域列出相关模板,选中Windows窗体应用程序。下边名称输入:WFAC

6、aller。【v】为解决方案创建目录,需打上勾。点右下方确定 ,即创建一个空白的WinForm应用程序。全部保存当前的解决方案。关闭解决方案,然后重新打开此解决方案,应能正常显示此解决方案。接下来在项目WebSvc1中添加一个主页:Default.aspx.在【解决方案资源管理器】中右键选中项目WebSvc1,> 添加 > 新建项 > Web > Web窗体。名称输入 :Default.Aspx > 确定 。即建立了一个空白主页。双击打开Default.Aspx。视图转到设计画面,若未到达,可从菜单:视图 > 设计器,或通过键盘操作:<Shift>

7、;+<F7>。在页面上输入一些文字,方便运行时查看Web网站是否能正常运行。按<F5>运行网站,应能从IE上看到主页:下面,将讲解如何在网站WebSvc1中加入WebService。三、 在Web工程中加入Web服务WebService简介Web 服务是 Web 服务器上的一些组件,客户端应用程序可通过 Web 发出 HTTP 请求来调用这些服务。通过 ASP.NET 您可以创建自定义的 Web 服务或使用内置的应用程序服务,并从任何客户端应用程序调用这些服务。ASP.NET 应用程序服务是内置的 Web 服务,这些服务提供对诸如 Forms 身份验证、角色和配置文件属

8、性等功能的访问。这些服务属于面向服务的体系结构 (SOA),在这种体系结构中,应用程序由服务器上提供的一个或多个服务以及一个或多个客户端组成。ASP.NET 应用程序服务的一个重要功能在于这些服务可供各种客户端应用程序使用,而不仅仅是 ASP.NET Web 应用程序。ASP.NET 应用程序服务可供基于 .NET Framework 的任何客户端使用。此外,可以发送和接收 SOAP 格式消息的任何客户端应用程序都可以使用 ASP.NET 应用程序服务。SOAP (Simple Object Access Protocol):简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、

9、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。下图演示不同客户端如何与服务进行通信。Web 服务通信在WebSvc1中加入WebService在【解决方案资源管理器】中右键选中项目WebSvc1,> 添加 > 新建项 > Web > Web服务。名称保留预设的:WebService1.asmx。> 确定 。即添加了一个WebSe

10、rvice。双击打开WebService1.asmx.cs,内容如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;namespace WebSvc1/ 应改掉,如改为: MySample / <summary> / WebService1 的摘要说明 / </summary> WebService(Namespace = "/

11、") WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1) System.ComponentModel.ToolboxItem(false) / 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 / System.Web.Script.Services.ScriptService public class WebService1 : System.Web.Services.WebService WebMethod public string HelloWorld() retur

12、n "Hello World" 自动生成的模板中,已经写入了一个Web方法:HelloWorld。点击保存,至此,已经加入了一个基本的WebService。检查WebService1.asmx能否正常工作:选中WebService1.asmx,按<F5>运行WebService1.asmx,正常能出现下面的页面内容。现在是由VS自带的Web服务器生产的页面。WebService1支持下列操作。有关正式定义,请查看服务说明。 · HelloWorld 此 Web 服务使用 / 作为默认命名空间。建议: 公开 XML We

13、b services 之前,请更改默认命名空间。每个 XML Web services 都需要一个唯一的命名空间,以便客户端应用程序能够将它与 Web 上的其他服务区分开。/ 可用于处于开发阶段的 XML Web services,而已发布的 XML Web services 应使用更为永久的命名空间。应使用您控制的命名空间来标识 XML Web services。例如,可以使用公司的 Internet 域名作为命名空间的一部分。尽管有许多 XML Web services 命名空间看似 URL,但它们不必指向 Web 上的实际资源。(XML Web serv

14、ices 命名空间为 URI。)使用 ASP.NET 创建 XML Web services 时,可以使用 WebService 特性的 Namespace 属性更改默认命名空间。WebService 特性适用于包含 XML Web services 方法的类。下面的代码实例将命名空间设置为“C#WebService(Namespace="public class MyWebService / 实现Visual Basic<WebService(Namespace:=" Public Class MyWebService ' 实现End ClassC+WebS

15、ervice(Namespace="public ref class MyWebService / 实现;有关 XML 命名空间的更多详细信息,请参阅 Namespaces in XML (XML 命名空间)上的 W3C 建议。有关 WSDL 的更多详细信息,请参阅 WSDL Specification (WSDL 规范)。有关 URI 的更多详细信息,请参阅 RFC 2396。点击页面中的HelloWorld ,页面跳转到调用画面:WebService1单击此处,获取完整的操作列表。HelloWorld测试若要使用 HTTP POST 协议对操作进行测试,请单击“调用”按钮。 窗体

16、顶端窗体底端SOAP 1.1以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。POST /WebService1.asmx HTTP/1.1Host: localhostContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "/HelloWorld"<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi=&

17、quot;/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:soap="/soap/envelope/"> <soap:Body> <HelloWorld xmlns="/" /> </soap:Body></soap:Envelope>HTTP/1.1 2

18、00 OKContent-Type: text/xml; charset=utf-8Content-Length: length<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:soap="http:/schemas.xmlsoa

19、/soap/envelope/"> <soap:Body> <HelloWorldResponse xmlns="/"> <HelloWorldResult>string</HelloWorldResult> </HelloWorldResponse> </soap:Body></soap:Envelope>SOAP 1.2以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。POST /WebService1.a

20、smx HTTP/1.1Host: localhostContent-Type: application/soap+xml; charset=utf-8Content-Length: length<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" x

21、mlns:soap12="/2003/05/soap-envelope"> <soap12:Body> <HelloWorld xmlns="/" /> </soap12:Body></soap12:Envelope>HTTP/1.1 200 OKContent-Type: application/soap+xml; charset=utf-8Content-Length: length<?xml version="1.

22、0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:soap12="/2003/05/soap-envelope"> <soap12:Body> <HelloWorldResponse xmlns="h

23、ttp://"> <HelloWorldResult>string</HelloWorldResult> </HelloWorldResponse> </soap12:Body></soap12:Envelope>HTTP POST以下是 HTTP POST 请求和响应示例。所显示的占位符需替换为实际值。POST /WebService1.asmx/HelloWorld HTTP/1.1Host: localhostContent-Type: application/x-www-form-urle

24、ncodedContent-Length: lengthHTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length<?xml version="1.0" encoding="utf-8"?><string xmlns="/">string</string>可尝试使用 HTTP POST 协议对操作进行测试,单击“调用”按钮,返回的页面如下:<?xml version=&q

25、uot;1.0" encoding="UTF-8"?><string xmlns="/">Hello World</string> <- 这是至本节结束的示范代码,可双击打开解压文件。四、 调用WebService下面讲述如何调用WebService。现在计划用解决方案中的WFACaler程序调用WebSvc1的HelloWorld方法。在Form1中加上一个按钮调用WebSvc1.WebService1,这个按钮用来执行调用操作。要能调用WebService,需在工程中引用

26、WebService。在【解决方案资源管理器】中右键选中项目WFACaler的引用 > 添加服务引用。点开 发现 下拉框,点击其中的 解决方案中的服务(S)。这时列出解决方案中的服务:WebService1.aspx。选中服务中的WebService1,下边命名空间保留预设的名称:ServiceRefrence1,点确定,引用完成。打开Form1.cs,还没编写代码,需加入两行using :using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy

27、stem.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.ServiceModel;/用于引用ServiceModel命名空间中的类型。using WFACaller.ServiceReference1; /用于引用本工程中的WebService引用类型。namespace WFACaller public partial class Form1 : Form public Form1() InitializeComponent(); 在按钮调用WebSvc1.WebServ

28、ice1(button1)的右边,加一个TextBox (textBox1),以便显示调用返加的结果。双击调用WebSvc1.WebService1(button1),进入此按钮的Click事件处理代码段,写入代码: private void button1_Click(object sender, EventArgs e) WFACaller.ServiceReference1.WebService1SoapClient aWSS = new WebService1SoapClient(); string sRslt = aWSS.HelloWorld(); textBox1.Text =

29、sRslt; 保存,然后在【解决方案资源管理器】中右键选中项目WFACaler > 生成,应能正确编译。按<F5> 执行,点击程序运行后的界面中的调用WebSvc1.WebService1 ,右边TextBox应能显示:Hello World。至此,表示调用成功,调用WebService方法已经初步掌握。使用VS自带的开发用Web服务器的好处是调试方便,但我们需要知道WebService发布后在生产环境是如何运行的,以及在准生产模拟环境下如何调试。本教程配合的开发环境是Win7+IIS7.0+SQL。如果你的电脑操作系统是Win7且还没启用IIS,需在Windows控制面板的

30、【程序和功能】中 > 在打开或关闭Windows功能中启用"万维网服务"。下一步,尝试从Visul Studio 自带的开发服务器改为由 IIS 7.0 Web服务器作WebSvc1网站的宿主引擎。在【解决方案资源管理器】中右键选中项目WebSvc1 > 在VS的IDE的菜单项目 > WebSvc1 属性(P),设置项目属性:在属性页左边选中Web,右区选中:"使用本地 IIS Web服务器"。项目 URL(J):http:/localhost/WebSvc1。然后点右边的创建虚拟目录(Y),创建此虚拟目录。在IIS中确认是否存在此虚拟

31、目录,并设置必要参数: 在计算机管理 > 服务和应用程序 > Internet信息服务(IIS)管理器。在右边列出的虚拟目录中选中WebSvc1。鼠标右键 > 管理应用程序 > 高级设置 > 应用程序池,选中 : ASP.NET v4.0 Classic > 确定。打开IE济览器,输入网址:http:/localhost/WebSvc1/WebService1.aspx。应能看到WebService1页面:表示WebSvc1/WebService1.aspx在IIS中是能正常运行的。下面讲解WFACaller客户端程序如何访问http:/localhost/

32、WebSvc1/WebService1.aspx。回到VS的IDE,运行WFACaller,点button1时将会出错,因为原来指向的网址是:http:/localhost:2524/WebService1.asmx。其中的2524端口随不同环境有所不同。现在打开WFACaller工程的文件app.config,内容如下:<?xml version="1.0" encoding="utf-8" ?><configuration> <system.serviceModel> <bindings> <ba

33、sicHttpBinding> <binding name="WebService1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="Str

34、ongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32

35、" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="&

36、quot; /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding>修改此网址为:http:/localhost/WebSvc1/WebService1.asmx </basicHttpBinding> </bindings> <client> <endpoint address="http:/localhost:2524/WebS

37、ervice1.asmx" binding="basicHttpBinding" bindingConfiguration="WebService1Soap" contract="ServiceReference1.WebService1Soap" name="WebService1Soap" /> </client> </system.serviceModel></configuration>其中节点<client>的节点<endpoint&g

38、t;属性address的值需改为:http:/localhost/WebSvc1/WebService1.asmx,保存。此时运行工程WFACaller,点button1,此时将出现附加安全警告对话框: 点附加,程序调用WebService1方法HelloWorld,返回文字到画面。若要禁止掉刚才的附加安全警告对话框,则要修改注册表项:HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio10.0DebuggerDisableAttachSecurityWarning,将值从0改到1即可。若不更改app.config中的网址,也可直接在程序中改变调用目标地

39、址,修改button1的事件处理代码为: WFACaller.ServiceReference1.WebService1SoapClient aWSS = new WebService1SoapClient(); string sWebSvcIP = "localhost" string sWebSvcURL = "http:/"+sWebSvcIP+"/WebSvc1/WebService1.asmx" EndpointAddress aEA = new EndpointAddress(sWebSvcURL); aWSS.Endpo

40、int.Address = aEA; string sRslt = aWSS.HelloWorld(); textBox1.Text = sRslt;本例实验完后, 请将WebSvc1工程属性中的Web > 服务器改回原来的:使用Visual Studio开发服务器。以便后面的开发容易调试。至此,已学会在客户端应用程序调用IIS中的WebService。 <- 这是至本节结束的示范代码,解压后覆盖前次的文件夹,则虚拟路径不用改。五、 三层结构概念常规的C/S架构是客户端程序直接连接数据库服务器,所有业务逻辑放在客户端或数据库的存储过程中。对于大型应用系统会导至安全性及结构上的缺陷。

41、后来发展了三层式架构甚至多层式架构(N-Tier)。三层式将应用分成三层:表现层(客户端)、中间层(应用服务器)、数据层(数据库)。客户端只能访问应用层,不能直接访问数据库,这样数据库可以隐藏在应用的后端,增加安全性;而应用层可以实现各种复杂的业务逻辑,从而使大型应用系统结构清晰。在开发管理方面,可以分别为不同层的程序进行最优化的开发。三层架构如下图:中间层(应用服务)(APP)方法/业务规则数据层(数据库)(DB)表现层(客户端)(Client)输入/显示三层架构中客户端与服务器的各种交互是通过调用应用服务的方法来实现的。加入WebService方法可在WebSvc1工程的WebServic

42、e1.asmx.cs中加入方法。在VS中,要作为WebService方法,需在方法上标注方法属性WebMethod,有此属性的方法才会在WebService网站公布出去。现在,示例编写一个读取数的方法,Opendata。 WebMethod public DataSet OpenData(string sSQL) /连接数据库及取数据: System.Data.SqlClient.SqlConnection sqlConnection1 = new System.Data.SqlClient.SqlConnection(); sqlConnection1.ConnectionString =

43、"Data Source=Localhost;Initial Catalog=Northwind;Integrated Security=True" sqlConnection1.Open(); System.Data.SqlClient.SqlDataAdapter aSDA = new System.Data.SqlClient.SqlDataAdapter(); System.Data.DataSet aDSet = new DataSet(); string sCmdTxt = sSQL; / "SELECT * FROM Customers ORDER

44、BY CustomerID" aSDA.SelectCommand = new System.Data.SqlClient.SqlCommand(sCmdTxt, sqlConnection1); aSDA.Fill(aDSet); /填充数据 return aDSet; 传入参数为sSQL-从客户端传来的SQL语句,约定读取的表是NorthWind数据库中的表Customers。实际应用中可依据业务逻辑需要而使用不同的参数及编写不同的实现代码,这里以简单例子说明基本原理和学习要点。OpenData方法中的连接参数预设为本地数据库,若为其它服务器的数据库,需修改连接参数。在此例中,读

45、取数据的代码按ADO.Net的常规写法。返回参数为DataSet。客户端程序如何识别返回的DataSet类型?客户端程序在引用WebService1时,由VS的IDE工具自动生成一些类型信息(在Service References目录中),结合客户端调用方法相匹配的形参,这样就可与Webservice方法相呼应。在页面调用WebService的方法OpenData,输入SQL: SELECT top 1 * FROM Customers ORDER BY CustomerID 执行,返回的内容是XML数据:<?xml version="1.0" encoding=&q

46、uot;UTF-8"?><DataSet xmlns="http:/MyS/"><xs:schema xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="/2001/XMLSchema" id="NewDataSet"><xs:element msdata:UseCurrentLocale="true&

47、quot; msdata:IsDataSet="true" name="NewDataSet"><xs:complexType><xs:choice maxOccurs="unbounded" minOccurs="0"><xs:element name="Table"><xs:complexType><xs:sequence><xs:element name="CustomerID" minOccurs

48、="0" type="xs:string"/><xs:element name="CompanyName" minOccurs="0" type="xs:string"/><xs:element name="ContactName" minOccurs="0" type="xs:string"/><xs:element name="ContactTitle" minOccurs=&

49、quot;0" type="xs:string"/><xs:element name="Address" minOccurs="0" type="xs:string"/><xs:element name="City" minOccurs="0" type="xs:string"/><xs:element name="Region" minOccurs="0" type=&

50、quot;xs:string"/><xs:element name="PostalCode" minOccurs="0" type="xs:string"/><xs:element name="Country" minOccurs="0" type="xs:string"/><xs:element name="Phone" minOccurs="0" type="xs:string

51、"/><xs:element name="Fax" minOccurs="0" type="xs:string"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microso

52、ft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><Table diffgr:id="Table1" msdata:rowOrder="0"><CustomerID>ALFKI</CustomerID><CompanyName>Alfreds Futterkiste</CompanyName&

53、gt;<ContactName>Maria Anders</ContactName><ContactTitle>Sales Representative</ContactTitle><Address>Obere Str. 57</Address><City>Berlin</City><PostalCode>12209</PostalCode><Country>Germany</Country><Phone>lt;/P

54、hone><Fax>lt;/Fax></Table></NewDataSet></diffgr:diffgram></DataSet>其它非.Net客户端应用程序可依据此XML解释数据结构。六、 在客户端调用读数据方法OpenDataWebService增删方法后,需在客户端工程中刷新服务引用。在WAFCaller工程中,选中ServiceReference1,> 鼠标右键 > 更新服务引用。在Form1中,先增加一个TextBox(textBox2),Text内容为:SELECT *

55、FROM Customers ORDER BY CustomerID,用来提供SQL语句。增加一按钮:调用WebSvc1.WebService1.OpenData(button2),用来从中间层读取数据。增加另一按钮:调用SaveData(button3) ,用来向中间层保存数据。放入一个DataGridView(dataGridView1),用来显示编辑读到的数据。button2的事件处理代码为: private void button2_Click(object sender, EventArgs e) WFACaller.ServiceReference1.WebService1SoapClient aWSS = new WebService1SoapClient(); DataSet aDSet = aWSS.OpenData(textBox2.Text); dataGridView1.DataSource = aDSet.Tables0; 编译WAFCaller,按 <F5>,运行,点击< button2>,正常情况能显示Customers表数据。<- 这是至本节结束的示范代码,解压后覆盖前次的文件夹,则虚拟

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论