首先本文不对SOAP有过多的解释,你只需知道它是--简单对象访问协议,一种轻量的、简单的、基于 XML 的协议。举个例子,WebService其实就基于SOAP的。
如果你需要了解SOAP的运行机制,请看这里:http://www.51script.com/?p=932
再简单的说一下,SOAP就是打包-->发送-->收包-->处理-->返回包等一系列流程,在ASP.NET中可以使用MSXML2中的XMLHTTPClass类来创建SOAP发送对象,先下载Interop.MSXML2.dll,然后复制到VS项目的bin目录,或者在VS里添加引用。创建如下代码:
view sourceprint?
001.#region 引用的命名空间
002.using System;
003.using System.IO;
004.using System.Data;
005.using System.Web;
006.using System.Text.RegularExpressions;
007.using System.Collections.Generic;
008.using System.Text;
009.using System.Xml;
010.using MSXML2;//xmlHttp所属命名空间(添加引用:COM->Microsoft Xml 3.0)
011.#endregion
012.
013.namespace Simple.SOAP
014.{
015. #region Send:处理 XML 数据的发送。
016. /// <summary>
017. /// 处理 XML 数据的发送。
018. /// </summary>
019. public class Send
020. {
021. /// <summary>
022. /// XMLHTTP 对象。
023. /// </summary>
024. private XMLHTTP xmlHttp = new XMLHTTPClass();
025. /// <summary>
026. /// Send 失败后的提示信息。
027. /// </summary>
028. private string _error = "";
029. /// <summary>
030. /// 发送数据包的字符串表现形式。
031. /// </summary>
032. private string _data = "";
033. /// <summary>
034. /// Send 返回数据包的字符串表现形式。
035. /// </summary>
036. private string _return = "";
037.
038. /// <summary>
039. /// 获取或设置发送数据包的字符串表现形式(建议发送XML数据文档的字符串表现形式)。
040. /// </summary>
041. public string Data
042. {
043. get
044. {
045. return _data;
046. }
047. set
048. {
049. _data = value;
050. }
051. }
052. /// <summary>
053. /// 获取 Send 返回数据包的字符串表现形式。
054. /// </summary>
055. public string Return
056. {
057. get
058. {
059. return _return;
060. }
061. }
062. /// <summary>
063. /// 获取 Send 失败后的提示信息。
064. /// </summary>
065. public string Error
066. {
067. get
068. {
069. return _error;
070. }
071. }
072.
073. /// <summary>
074. /// 初始化 Send 类的新实例。
075. /// </summary>
076. public Send()
077. {
078. }
079. /// <summary>
080. /// 初始化 Send 类的新实例。
081. /// </summary>
082. /// <param name="data">要发送数据的字符串表现形式(建议发送 XML 数据文档的字符串表现形式)。</param>
083. public Send(string data)
084. {
085. _data = data;
086. }
087.
088. /// <summary>
089. /// 发送数据。
090. /// </summary>
091. /// <param name="url">要发送到的Url路径字符串。</param>
092. /// <returns>true 表示发送成功,false 发送失败。</returns>
093. public bool ExecuteSend(string url)
094. {
095. return ExecuteSend("POST", url);
096. }
097. /// <summary>
098. /// 发送数据。
099. /// </summary>
100. /// <param name="url">要发送到的 url 路径字符串。</param>
101. /// <param name="method">发送方式。</param>
102. /// <returns>true 表示发送成功,false 发送失败。</returns>
103. public bool ExecuteSend(string url, string method)
104. {
105. bool b = false;
106. xmlHttp.open(method, url, false, null, null);
107. xmlHttp.send(_data);
108. if (xmlHttp.readyState == 4)
109. {
110. if (xmlHttp.status == 200)
111. {
112. _return = xmlHttp.responseText;
113. b = true;
114. }
115. else
116. {
117. _error = "请求页面有异常(XMLHTTP.status=" + xmlHttp.status + ")。";
118. }
119. }
120. else
121. {
122. _error = "请求页面有异常(XMLHTTP.readyState=" + xmlHttp.readyState + ")。";
123. }
124. return b;
125. }
126. }
127. #endregion
128.
129. #region Incept:处理 XML 数据的接收。
130. /// <summary>
131. /// 处理 XML 数据的接收。
132. /// </summary>
133. public static class Incept
134. {
135. /// <summary>
136. /// 获取接收的数据包,并使用指定的编码对数据包进行解码。
137. /// </summary>
138. /// <returns>数据包的字符串形式。</returns>
139. public static string ExecuteIncept()
140. {
141. return ExecuteIncept(Encoding.GetEncoding("utf-8"));
142. }
143. /// <summary>
144. /// 获取接收的数据包,并使用指定的编码对数据包进行解码。
145. /// </summary>
146. /// <param name="encode">与首选编码相对应的代码页值。</param>
147. /// <returns>数据包的字符串形式。</returns>
148. public static string ExecuteIncept(int encode)
149. {
150. return ExecuteIncept(Encoding.GetEncoding(encode));
151. }
152. /// <summary>
153. /// 获取接收的数据包,并使用指定的编码对数据包进行解码。
154. /// </summary>
155. /// <param name="encode">字符编码的名称。</param>
156. /// <returns>数据包的字符串形式。</returns>
157. public static string ExecuteIncept(string encode)
158. {
159. return ExecuteIncept(Encoding.GetEncoding(encode));
160. }
161. /// <summary>
162. /// 获取接收的数据包,并使用指定的编码对数据包进行解码。
163. /// </summary>
164. /// <param name="encode">字符编码对象实例。</param>
165. /// <returns>数据包的字符串形式。</returns>
166. public static string ExecuteIncept(Encoding encode)
167. {
168. StreamReader sr = new StreamReader(HttpContext.Current.Request.InputStream, encode);
169. return sr.ReadToEnd();
170. }
171. }
172. #endregion
173.
174. #region Return:处理 XML 数据的返回。
175. /// <summary>
176. /// 处理 XML 数据的返回。
177. /// </summary>
178. public static class Return
179. {
180. /// <summary>
181. /// 返回 XML 数据包。
182. /// </summary>
183. /// <param name="body">要返回的 XML 的字符串表现形式。</param>
184. public static void ExecuteReturn(string body)
185. {
186. ExecuteReturn(body, "utf-8");
187. }
188. /// <summary>
189. /// 返回 XML 数据包。
190. /// </summary>
191. /// <param name="body">要返回的 XML 的字符串表现形式。</param>
192. /// <param name="encode">输出字符的编码格式。</param>
193. public static void ExecuteReturn(string body, string encode)
194. {
195. if (!new Regex(@"^<\\\?xml.*\\\?>.*$", RegexOptions.IgnoreCase).IsMatch(Regex.Escape(body)))
196. {
197. body = "<?xml version=\"1.0\" encoding=\"" + encode + "\" ?>\n" + body;
198. }
199. else
200. {
201. string start = body.Substring(0, body.IndexOf("\"?>"));
202. string left = body.Substring(0, start.LastIndexOf("\"") + 1);
203. body = left + encode + body.Substring(body.IndexOf("\"?>"));
204. }
205. HttpContext.Current.Response.Clear();
206. HttpContext.Current.Response.Buffer = true;
207. HttpContext.Current.Response.ContentType = "text/xml";
208. HttpContext.Current.Response.Charset = encode;
209. HttpContext.Current.Response.Expires = 0;
210. HttpContext.Current.Response.Write(body);
211. HttpContext.Current.Response.End();
212. }
213. }
214. #endregion
215.}
如果你已经读过上一篇:ASP之SOAP的发送、接收与处理类 ,那么你现在已经知道如何使用这三个类了。很简单,创建Send发送类,并发送XML数据包,在接收站点中,创建Incept接收包,并读取和处理发送站点传递过来的数据包,然后再创建Return返回类,并返回(打印)数据包,最后在发送站点中读取这个返回包并处理,OK了。。这就是SOAP流程。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xz2001/archive/2009/05/31/4228582.aspx