使用.NET类编写SOAP协议调用Web服务
.net 调用 web server的方法

随着互联网的普及和发展,Web服务器的应用越来越广泛,而在.NET 开发中,调用Web服务器是非常常见的操作。
本文将详细介绍在.NET开发中调用Web服务器的方法。
1. 使用HttpWebRequest和HttpWebResponse类在.NET开发中,可以使用HttpWebRequest和HttpWebResponse 类来实现与Web服务器的交互。
HttpWebRequest类用于创建一个HTTP请求,HttpWebResponse类用于获取服务器的响应。
通过这两个类,可以实现与Web服务器的通信。
以下是一个简单的示例代码:```csharp// 创建一个HttpWebRequest对象HttpWebRequest request =(HttpWebRequest)WebRequest.Create("网络协议xxx");// 设置请求的方法为GETrequest.Method = "GET";// 获取服务器的响应HttpWebResponse response =(HttpWebResponse)request.GetResponse();Stream stream = response.GetResponseStream(); StreamReader reader = new StreamReader(stream);string responseContent = reader.ReadToEnd();```通过上面的代码,可以实现与Web服务器的简单交互。
在实际开发中,还可以根据需要设置请求的其他参数,如请求头、请求体等。
2. 使用HttpClient类在.NET Framework 4.5及以上版本中引入了HttpClient类,它提供了更加灵活和方便的方式与Web服务器进行交互。
HttpClient类使用起来更加简洁,以下是一个简单的示例代码:```csharp// 创建一个HttpClient对象HttpClient client = new HttpClient();// 向服务器发送一个GET请求HttpResponseMessage response = aw本人t client.GetAsync("网络协议xxx");string responseContent = aw本人tresponse.Content.ReadAsStringAsync();```通过HttpClient类,可以方便地实现与Web服务器的交互。
(整理)WebService与SAPECC系统服务发布与调用.

SAP ECC系统Web Service服务发布与调用目录Web Service概念 (3)ECC 6.0 SP14之后版本 (4)发布Web Service服务: (4)1. SE37创建Function (4)2. SE80创建服务 (5)3. SOAMANAGER配置服务 (7)调用SAP系统发布的Web Service服务 (10)1. SE80创建代理 (10)2. LPCONFIG创建Logical Port (11)3. 测试代理 (13)调用外部异构系统发布的Web Service服务 (15)1. SE80创建代理 (15)2. LPCONFIG创建Logical Port (16)3. 测试代理 (17)ECC 6.0 SP14之前版本 (19)发布Web Service服务: (19)1. SE37创建Function (19)2. SE80创建服务 (20)3. WSCONFIG (23)4. WSADMIN (26)调用Web Service服务。
(29)1. SE80创建代理 (29)2. LPCONFIG创建Logical Port (30)3. 测试代理 (31)Web Service概念简单来说,Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。
Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。
注:SOAP协议(Simple Object Access Protocol,简单对象访问协议),它是基于XML的用于分散和分布式环境下网络信息交换的通讯协议。
在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。
它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。
使用.NET类编写SOAP协议调用Web服务

使用.NET类编写SOAP协议调用Web服务简介:使用.NET类编写SOAP消息,SOAP消息中包含用户的用户帐号,用户密码和帐号ID。
使用HttpWebRequest类发送SOAP请求,请求远程服务器上Web服务程序(客户帐户信息),并使用HttpWebResponse类获取服务响应。
知识点:命名空间:System.Xml创建XML文档的类:XmlTextWriter1.创建XmlTextWriter 对象,设置用Tab键缩进代码示例:XmlTextWriter BookWriter = new XmlTextWriter( @"\catalog\books.xml", Encoding.UTF8);BookWriter.Formatting = Formatting.Indented;2.编写XML文档的根元素使用WriteStartDocument()方法和WriteEndDocument()方法创建XML声明使用WriteStartElement()方法和WriteEndElement()方法创建根元素代码示例:BookWriter.WriteStartDocument();BookWriter.WriteStartElement("books");// 其他元素BookWriter.WriteEndElement();BookWriter.WriteEndDocument();输出:<?xml version="1.0" encoding="utf-8" ?><books><!-- write other elements here --></books>3.编写元素使用WriteElementString()方法创建不包含子元素和属性的元素代码示例:BookWriter.WriteElementString("price", "19.95");输出:<price>19.95</price>使用WriteStartElement()和WriteEndElement() 方法创建含有下级子元素和属性的元素代码示例:BookWriter.WriteStartElement("book");BookWriter.WriteElementString("price", "19.95");BookWriter.WriteEndElement();输出:<book><price>19.95</price></book>4.编写属性代码示例:BookWriter.WriteStartElement("book");BookWriter.WriteAttributeString("price", "19.95");BookWriter.WriteEndElement();输出:<book price="19.95" />5.编写带有命名空间的元素使用WriteElementString()方法或WriteStartElement()方法编写带命名空间的元素代码示例:BookWriter.WriteStartElement("hr", "Name", "http://hrweb");BookWriter.WriteString("Nancy Davolio");BookWriter.WriteEndElement();输出:<hr:Name>Nancy Davolio</hr:Name>6.编写带有命名空间的属性使用WriteAttributeString()方法为元素添加带命名空间的属性public void WriteAttributeString (string prefix,string localName,string ns,string value)参数prefix:属性的命名空间前缀。
C#通过Get、Post、Soap调用WebService的方法

C#通过Get、Post、Soap调⽤WebService的⽅法实现代码来源于⽹络,我只是作了⼀些修改!using System;using System.Web;using System.Xml;using System.Collections;using ;using System.Text;using System.IO;using System.Xml.Serialization;/// <summary>/// 利⽤WebRequest/WebResponse进⾏WebService调⽤的类/// </summary>public class WebServiceHelper{//<webServices>// <protocols>// <add name="HttpGet"/>// <add name="HttpPost"/>// </protocols>//</webServices>private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调⽤GetNamespace/// <summary>/// 需要WebService⽀持Post调⽤/// </summary>public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";SetWebRequest(request);byte[] data = EncodePars(Pars);WriteRequestData(request, data);return ReadXmlResponse(request.GetResponse());}/// <summary>/// 需要WebService⽀持Get调⽤/// </summary>public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));request.Method = "GET";request.ContentType = "application/x-www-form-urlencoded";SetWebRequest(request);return ReadXmlResponse(request.GetResponse());}/// <summary>/// 通⽤WebService调⽤(Soap),参数Pars为String类型的参数名、参数值/// </summary>public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars){if (_xmlNamespaces.ContainsKey(URL)){return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());}else{return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));}}/// <summary>/// 通⽤WebService调⽤(Soap)/// </summary>/// <param name="URL"></param>/// <param name="MethodName"></param>/// <param name="Pars"></param>/// <param name="XmlNs"></param>/// <returns></returns>private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs){_xmlNamespaces[URL] = XmlNs;//加⼊缓存,提⾼效率HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);request.Method = "POST";request.ContentType = "text/xml; charset=utf-8";request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");SetWebRequest(request);byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);WriteRequestData(request, data);XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();doc = ReadXmlResponse(request.GetResponse());XmlNamespaceManager mgr = new XmlNamespaceManager(Table);mgr.AddNamespace("soap", "/soap/envelope/");String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;doc2.LoadXml("<root>" + RetXml + "</root>");AddDelaration(doc2);return doc2;}/// <summary>/// 通过WebService的WSDL获取XML名称空间/// </summary>/// <param name="URL"></param>/// <returns></returns>private static string GetNamespace(String URL){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");SetWebRequest(request);WebResponse response = request.GetResponse();StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);XmlDocument doc = new XmlDocument();doc.LoadXml(sr.ReadToEnd());sr.Close();return doc.SelectSingleNode("//@targetNamespace").Value;/// 动态⽣成SOP请求报⽂内容/// </summary>/// <param name="Pars"></param>/// <param name="XmlNs"></param>/// <param name="MethodName"></param>/// <returns></returns>private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName){XmlDocument doc = new XmlDocument();doc.LoadXml("<soap:Envelope xmlns:xsi=\"/2001/XMLSchema-instance\" xmlns:xsd=\"/2001/XMLSchema\" xmlns:soap=\"/soap/envelope/\"></soap:Envelope>"); AddDelaration(doc);XmlElement soapBody = doc.CreateElement("soap", "Body", "/soap/envelope/");XmlElement soapMethod = doc.CreateElement(MethodName);soapMethod.SetAttribute("xmlns", XmlNs);foreach (string k in Pars.Keys){XmlElement soapPar = doc.CreateElement(k);soapPar.InnerXml = ObjectToSoapXml(Pars[k]);soapMethod.AppendChild(soapPar);}soapBody.AppendChild(soapMethod);doc.DocumentElement.AppendChild(soapBody);return Encoding.UTF8.GetBytes(doc.OuterXml);}/// <summary>/// 将对象转换成XML节点格式/// </summary>/// <param name="o"></param>/// <returns></returns>private static string ObjectToSoapXml(object o){XmlSerializer mySerializer = new XmlSerializer(o.GetType());MemoryStream ms = new MemoryStream();mySerializer.Serialize(ms, o);XmlDocument doc = new XmlDocument();doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));if (doc.DocumentElement != null){return doc.DocumentElement.InnerXml;}else{return o.ToString();}}/// <summary>/// 设置WEB请求/// </summary>/// <param name="request"></param>private static void SetWebRequest(HttpWebRequest request){request.Credentials = CredentialCache.DefaultCredentials;request.Timeout = 10000;}/// <summary>/// 设置请求数据/// </summary>/// <param name="request"></param>/// <param name="data"></param>private static void WriteRequestData(HttpWebRequest request, byte[] data){request.ContentLength = data.Length;Stream writer = request.GetRequestStream();writer.Write(data, 0, data.Length);writer.Close();}/// <summary>/// 获取字符串的UTF8码字符串/// </summary>/// <param name="Pars"></param>/// <returns></returns>private static byte[] EncodePars(Hashtable Pars){return Encoding.UTF8.GetBytes(ParsToString(Pars));}/// <summary>/// 将Hashtable转换成WEB请求键值对字符串/// </summary>/// <param name="Pars"></param>/// <returns></returns>private static String ParsToString(Hashtable Pars){StringBuilder sb = new StringBuilder();foreach (string k in Pars.Keys){if (sb.Length > 0){sb.Append("&");}sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));}return sb.ToString();}/// <summary>/// 获取Webservice响应报⽂XML/// </summary>/// <param name="response"></param>/// <returns></returns>private static XmlDocument ReadXmlResponse(WebResponse response){StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);String retXml = sr.ReadToEnd();sr.Close();XmlDocument doc = new XmlDocument();doc.LoadXml(retXml);return doc;/// 设置XML⽂档版本声明/// </summary>/// <param name="doc"></param>private static void AddDelaration(XmlDocument doc){XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);doc.InsertBefore(decl, doc.DocumentElement);}}以上是在不引⽤WEB服务的条件下动态调⽤WEB服务⽅法,如果该服务地址不确定或后期有可能会变动,则采⽤上述这些⽅法会⽐较好,当然如果服务地址不会出现变更的情况下,可以在VS中直接引⽤WEB服务,然后就可调⽤⾃动⽣成的SOAPClient类来调⽤相应的WEB服务⽅法,这样就简单很多,如下:avar client = new SmsService.wmgwSoapClient(); //wmgwSoapClient就是引⽤WEB服务后⾃动⽣成的类string result = client.MongateSendSubmit(tuserId.Text, tpassword.Text, tpszMobis.Text, tpszMsg.Text, int.Parse(tiMobiCount.Text),tpszSubPort.Text, tMsgId.Text);。
.NET 访问JAVA的WEBSERVICE使用SOAP头

.NET 访问JAVA的WEBSERVICE使用SOAP头进来做的项目需要和JAVA的WebServices进行交互,其中访问WS的时候需要传入SOAP 头进行验证。
其中关键就是SOAP头内容。
由于JAVA的WS在.NET下生成的代理是没有SOAP 头的内容,所以需要手工修改代理类,达到可以传输SOAP头的目的。
1:修改代理类,建立SOAP头的对象:/// <remarks/>[piler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3053")][System.SerializableAttribute()][System.Diagnostics.DebuggerStepThroughAttribute()][ponentModel.DesignerCategoryAttribute("code")][System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)] public partial class MySoapHeader : System.Web.Services.Protocols.SoapHeader{private string tokenValue;private System.Xml.XmlAttribute[] anyAttrField;/// <remarks/>//[XmlIgnoreAttribute]//[XmlAttribute("")][XmlTextAttribute()]public string TokenValue{get{return this.tokenValue;}set{this.tokenValue = value;}}/// <remarks/>[System.Xml.Serialization.XmlAnyAttributeAttribute()]public System.Xml.XmlAttribute[] AnyAttr{get{return this.anyAttrField;}set{this.anyAttrField = value;}}}2:修改代理类,添加一个SOAP对象:private mySoapHeader soapHeaderValue;public MySoapHeader SoapHeaderValue{get{return this.soapHeaderValue;}set{this.soapHeaderValue = value;}}3:在需要SOAP上方法上添加如下的代码:[System.Web.Services.Protocols.SoapHeaderAttribute("SoapHeaderValue")]public bool verifyWebserviceTest(){object[] results = this.Invoke("verifyWebserviceTest", new object[0]);return ((bool)(results[0]));}调用的时候使用如下代码:ArcWS.ManDispCmdSessionBeanService ws = new ARSSMonSite.ArcWS.ManDispCmdSessionBeanService();ArcWS.loginToken soapHeader = new ARSSMonSite.ArcWS.loginToken();soapHeader.TokenValue = "arsssongguixiang#19990101010101";ws.SoapHeaderValue = soapHeader;ws.verifyWebserviceTest();这样,就可以正确的向JAVS的WS传送SOAP头的信息。
.net framework调用webservice接口步骤

.net framework调用webservice接口步骤在.NETFramework中,调用Webservice接口是一项重要的任务,它允许我们与远程服务器进行通信,执行特定的操作并获取结果。
下面是一个详细的步骤指南,指导您如何在.NETFramework中调用Webservice接口:步骤1:添加Webservice引用首先,您需要将Webservice的URL添加到项目中,以便在代码中引用它。
您可以使用“添加服务引用”对话框来完成此操作。
在VisualStudio中,导航到“服务”选项卡,然后选择“添加服务引用”。
在URL框中,输入Webservice的URL地址,并确保选择正确的协议(如HTTP或SOAP)。
步骤2:创建代理类一旦您添加了Webservice引用,VisualStudio将为您生成一个代理类。
这个类将包含用于与Webservice交互的方法。
您可以使用这个代理类来调用Webservice的方法。
步骤3:编写代码调用Webservice方法接下来,您需要编写代码来调用Webservice的方法。
通常,这些方法使用SOAP(SimpleObjectAccessProtocol)格式,并返回XML数据。
您可以使用代理类中的方法来执行此操作。
以下是一个简单的示例代码,展示了如何调用一个名为“MyWebService”的Webservice的方法:```csharp//创建代理对象MyWebServiceClientclient=newMyWebServiceClient();//调用方法并获取结果stringresult=client.MyWebServiceMethod();```在这个示例中,“MyWebServiceClient”是自动生成的代理类,而“MyWebServiceMethod”是您要调用的Webservice方法。
您需要将实际方法的名称替换为适当的名称。
步骤4:处理返回结果一旦您调用了Webservice方法并获得了结果,您需要对其进行适当的处理。
C#.NET动态调用webservice的三种方式

动态调用webservice的三种方式多数时候我们通过"添加Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。
在.NET Framework 的System.Web.Services.Description 命名空间中有我们需要的东西。
具体步骤:1. 从目标URL 下载WSDL 数据。
2. 使用ServiceDescription 创建和格式化WSDL 文档文件。
3. 使用ServiceDescriptionImporter 创建客户端代理类。
4. 使用CodeDom 动态创建客户端代理类程序集。
5. 利用反射调用相关WebService 方法。
上述步骤需要引用如下四个名称空间:using System.Web.Services.Description; //WS的描述//以下几个用于根据描述动态生成代码并动态编译获取程序集using System.CodeDom;using Microsoft.CSharp;using System.CodeDom.piler;上述几个名称空间中包括如下几个重要的类:using System.Web.Services.Description下:ServiceDescription //WS描述ServiceDescriptionImporter //通过描述生成客户端代理类,特别注意其中的Style以下是MSDN对其的描述:XML Web services 的接口通常由Web 服务描述语言(WSDL) 文件来说明。
例如,若要获取有关使用localhost/service.asmx 处公开的 的Web 服务的WSDL 说明,只需导航到localhost/service.asmx?WSDL。
使用ServiceDescriptionImporter 类可以方便地将WSDL 说明中包含的信息导入到System.CodeDom.CodepileUnit 对象。
ASP.NET调用WebService服务的方法详解

调⽤WebService服务的⽅法详解本⽂实例讲述了调⽤WebService服务的⽅法。
分享给⼤家供⼤家参考,具体如下:⼀、WebService:WebService是以独⽴于平台的⽅式,通过标准的Web协议,可以由程序访问的应⽤程序逻辑单元。
(1)应⽤程序逻辑单元:web服务包括⼀些应⽤程序逻辑单元或者代码。
这些代码可以完成运算任务,可以完成数据库查询,可以完成计算机程序能够完成的任何⼯作。
(2)可由程序访问:当前⼤多是web站点都是通过浏览器由⼈⼯访问的,web服务可以由计算机程序来访问。
(3)标准的we协议:Web服务的所有协议都是基于⼀组标准的Web协议,如HTTP、XML、SOAP、WSDl、UDDI等(4)平台独⽴性:web服务可以在任何平台上实现。
因为标准协议不是由单个供应商专⽤的,它由⼤多数主要供应商⽀持。
SOAP(Simple Object Access Protocol,简单对象访问协议)协议:是⽤于交换XML编码信息的轻量级协议,SOAP协议是HTTP和XML协议的组合。
WSDL(Web Service Description Language,Web服务描述语⾔)是⽤XML⽂档来描述Web服务的标准,是Web服务的接⼝定义语⾔。
⼆、创建 WEB服务建⽴Web服务就是把⼀些信息或逻辑对其他计算机和客户公开,进⼀步说,就是从⽀持SOAP通信的类中建⽴⼀个或多个⽅法。
创建Web服务的步骤:(VS2008)⾸先,新建⼀个⽹站。
选择⽂件-------->新建--------->⽹站,打开“新建⽹站”对话框,选择“ web服务”模板。
确定后,创建成功。
创建好后,会⽣成Service.asmx,其代码隐藏⽂件Servece.cs位于App_Code⽂件中。
Web服务⽂件都使⽤扩展名.asmx。
发现在VS2010中,创建web服务是先新建⼀个⽹站,在选择添加新项,然后选择web 服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用.NET类编写SOAP协议调用Web服务简介:使用.NET类编写SOAP消息,SOAP消息中包含用户的用户帐号,用户密码和帐号ID。
使用HttpWebRequest类发送SOAP请求,请求远程服务器上Web服务程序(客户帐户信息),并使用HttpWebResponse类获取服务响应。
知识点:命名空间:System.Xml创建XML文档的类:XmlTextWriter1.创建XmlTextWriter 对象,设置用Tab键缩进代码示例:XmlTextWriter BookWriter = new XmlTextWriter( @"\catalog\books.xml", Encoding.UTF8);BookWriter.Formatting = Formatting.Indented;2.编写XML文档的根元素使用WriteStartDocument()方法和WriteEndDocument()方法创建XML声明使用WriteStartElement()方法和WriteEndElement()方法创建根元素代码示例:BookWriter.WriteStartDocument();BookWriter.WriteStartElement("books");// 其他元素BookWriter.WriteEndElement();BookWriter.WriteEndDocument();输出:<?xml version="1.0" encoding="utf-8" ?><books><!-- write other elements here --></books>3.编写元素使用WriteElementString()方法创建不包含子元素和属性的元素代码示例:BookWriter.WriteElementString("price", "19.95");输出:<price>19.95</price>使用WriteStartElement()和WriteEndElement() 方法创建含有下级子元素和属性的元素代码示例:BookWriter.WriteStartElement("book");BookWriter.WriteElementString("price", "19.95");BookWriter.WriteEndElement();输出:<book><price>19.95</price></book>4.编写属性代码示例:BookWriter.WriteStartElement("book");BookWriter.WriteAttributeString("price", "19.95");BookWriter.WriteEndElement();输出:<book price="19.95" />5.编写带有命名空间的元素使用WriteElementString()方法或WriteStartElement()方法编写带命名空间的元素代码示例:BookWriter.WriteStartElement("hr", "Name", "http://hrweb");BookWriter.WriteString("Nancy Davolio");BookWriter.WriteEndElement();输出:<hr:Name>Nancy Davolio</hr:Name>6.编写带有命名空间的属性使用WriteAttributeString()方法为元素添加带命名空间的属性public void WriteAttributeString (string prefix,string localName,string ns,string value)参数prefix:属性的命名空间前缀。
localName:属性的本地名称。
ns:属性的命名空间URI。
value:属性值。
此方法写出具有用户定义的命名空间前缀的属性,并将其与给定的命名空间进行关联。
如果前缀为“xmlns”,则此方法也将此当做命名空间声明对待,并将声明的前缀与给定属性值中提供的命名空间URI 进行关联。
在这种情况下,ns参数可以为空引用。
代码示例:xtw.WriteStartElement("bookstore");// Write the namespace declarationxtw.WriteAttributeString( "xmlns", "bk", null, "urn:samples");xtw.WriteStartElement("book");// Lookup the prefix and then write the ISBN attribute.string prefix = xtw.LookupPrefix("urn:samples");xtw.WriteStartAttribute(prefix, "ISBN", "urn:samples");xtw.WriteString("1-861003-78");xtw.WriteEndAttribute();// Write the style elementxtw.WriteStartElement(prefix, "style", "urn:samples");xtw.WriteString("hardcover");xtw.WriteEndElement();// Write the end tag for the book and root elementsxtw.WriteEndElement();xtw.WriteEndElement();输出:<bookstore xmlns:bk="urn:samples"><book bk:ISBN="1-861003-78"><bk:style>hardcover</bk:style></book></bookstore>任务:演示——使用.NET类构架SOAP协议调用Web服务第1步:建立BulidSOAPMessage类,添加静态方法SOAPMessage构建SOAP消息。
using System;using System.IO;using System.Xml;using System.Text;/// <summary>/// BulidSOAPMessage 的摘要说明/// </summary>public class BulidSOAPMessage{public static string SOAPMessage(string userID, string password, string acctID){try{string str=null;using( MemoryStream mStream = new MemoryStream()) //创建内存流对象{using(XmlTextWriter xtw = new XmlTextWriter(mStream,Encoding.UTF8)) //创建写内存流对象{//定义前缀字符串string xsi = "/2001/XMLSchema-instance";string xsd = "/2001/XMLSchema";string soap = "/soap/envelope/";string namespaceurl = "/";//书写缩进的XML文档,设置用tab键缩进xtw.Formatting = Formatting.Indented;//书写版本为“1.0”,并具有独立属性的XML声明,即<?xml version='1.0' encodeding='utf-8'?>xtw.WriteStartDocument();//书写开始标记"Envelope",并与给定的命名空间"/soap/envelope/"和前缀"soap"关联xtw.WriteStartElement("soap", "Envelope", soap);//声明属性xmlns:xsi="/2001/XMLSchema-instance"xtw.WriteAttributeString("xmlns", "xsi", null, xsi);//声明属性xmlns:xsd="/2001/XMLSchema"xtw.WriteAttributeString("xmlns", "xsd", null, xsd);//声明属性xmlns:soap="/soap/envelope/"xtw.WriteAttributeString("xmlns", "soap", null, soap);//声明复合元素“Header”,并与"soap"前缀关联xtw.WriteStartElement("Header", soap);//声明“Header”的子元素"WoodgroveAuthInfo",与命名空间nsurl 关联,不指定前缀xtw.WriteStartElement(null, "WoodgroveAuthInfo", namespaceurl);//声明"WoodgroveAuthInfo"元素内包含的基本元素"Username"和"Password",并赋值xtw.WriteElementString("Username", userID);xtw.WriteElementString("Password", password);//结束"WoodgroveAuthInfo"和“Header”的声明xtw.WriteEndElement();xtw.WriteEndElement();//声明"Body"元素,并与soap命名空间关联xtw.WriteStartElement("Body", soap);//声明"Body"元素下的嵌套子元素"GetAccount",关联Web服务给定的命名空间,不设前缀xtw.WriteStartElement(null, "GetAccount", namespaceurl);//声明"GetAccount"元素下嵌套的基本元素"acctID",并赋值xtw.WriteElementString("acctID", acctID);//结束"GetAccount"和"Body"声明xtw.WriteEndElement();xtw.WriteEndElement();//结束"Envelope"声明xtw.WriteEndDocument();//将缓冲区中数据刷新到基础流,并同时刷新基础流xtw.Flush();//将基础数据流转换为字符串str = MemStreamToString(mStream);}}return str;}catch{return null;}}private static string MemStreamToString(MemoryStream mStream){//将基础流的数据转换为无符号的字节数组byte[] buffer = mStream.GetBuffer();//创建把字节序列转换为字符序列的解码器Decoder d = Encoding.UTF8.GetDecoder();//创建字符缓冲区,用于存放解码后的字符序列char[] chars = new char[buffer.Length];//使用解码器将字节数组转换为字符数组d.GetChars(buffer, 3, buffer.Length - 3, chars, 0);//将字符数组转换为字符串string str = new String(chars);return str;}}第2步:创建处理类SOAPMessageHandler,使用SOAP协议调用Web服务using System;using ;using System.IO;/// <summary>/// SOAPMessageHandler 的摘要说明/// </summary>public class SOAPMessageHandler{public string SOAPResponse{get { return _privateSOAPResponse; }}private string _privateSOAPResponse = null;private string _privateSOAPMessage = null;public SOAPMessageHandler(string userID, string password, string acctID,string uri) {//构建SOAP请求消息_privateSOAPMessage = BulidSOAPMessage.SOAPMessage(userID, password, acctID);if (_privateSOAPMessage != null){_privateSOAPResponse=this.GetSOAPMessage(uri,_privateSOAPMessage);}}private string GetSOAPMessage(string uri,string content){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(uri));request.ContentType = "text/xml;charset=utf-8";request.ContentLength = _privateSOAPMessage.Length;request.Method = "POST";request.Headers.Add("/GetAccount");using (StreamWriter sw = new StreamWriter(request.GetRequestStream())){sw.Write(content);}string str=null;using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){using(StreamReader reader = new StreamReader(response.GetResponseStream())){str = reader.ReadToEnd();}}return str;}}。