首先本文不对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

posted on 2009-11-24 21:02  EricLi  阅读(658)  评论(1编辑  收藏  举报