ASP.NET之SOAP的发送、接收与处理类 [转载]
首先本文不對(duì)SOAP有過(guò)多的解釋,你只需知道它是--簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議,一種輕量的、簡(jiǎn)單的、基于 XML 的協(xié)議。舉個(gè)例子,WebService其實(shí)就基于SOAP的。
如果你需要了解SOAP的運(yùn)行機(jī)制,請(qǐng)看這里:http://www.51script.com/?p=932
再簡(jiǎn)單的說(shuō)一下,SOAP就是打包-->發(fā)送-->收包-->處理-->返回包等一系列流程,在ASP.NET中可以使用MSXML2中的XMLHTTPClass類(lèi)來(lái)創(chuàng)建SOAP發(fā)送對(duì)象,先下載Interop.MSXML2.dll,然后復(fù)制到VS項(xiàng)目的bin目錄,或者在VS里添加引用。創(chuàng)建如下代碼:
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 數(shù)據(jù)的發(fā)送。
016.??? /// <summary>
017.??? /// 處理 XML 數(shù)據(jù)的發(fā)送。
018.??? /// </summary>
019.??? public class Send
020.??? {
021.??????? /// <summary>
022.??????? /// XMLHTTP 對(duì)象。
023.??????? /// </summary>
024.??????? private XMLHTTP xmlHttp = new XMLHTTPClass();
025.??????? /// <summary>
026.??????? /// Send 失敗后的提示信息。
027.??????? /// </summary>
028.??????? private string _error = "";
029.??????? /// <summary>
030.??????? /// 發(fā)送數(shù)據(jù)包的字符串表現(xiàn)形式。
031.??????? /// </summary>
032.??????? private string _data = "";
033.??????? /// <summary>
034.??????? /// Send 返回?cái)?shù)據(jù)包的字符串表現(xiàn)形式。
035.??????? /// </summary>
036.??????? private string _return = "";
037.?
038.??????? /// <summary>
039.??????? /// 獲取或設(shè)置發(fā)送數(shù)據(jù)包的字符串表現(xiàn)形式(建議發(fā)送XML數(shù)據(jù)文檔的字符串表現(xiàn)形式)。
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 返回?cái)?shù)據(jù)包的字符串表現(xiàn)形式。
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 類(lèi)的新實(shí)例。
075.??????? /// </summary>
076.??????? public Send()
077.??????? {
078.??????? }
079.??????? /// <summary>
080.??????? /// 初始化 Send 類(lèi)的新實(shí)例。
081.??????? /// </summary>
082.??????? /// <param name="data">要發(fā)送數(shù)據(jù)的字符串表現(xiàn)形式(建議發(fā)送 XML 數(shù)據(jù)文檔的字符串表現(xiàn)形式)。</param>
083.??????? public Send(string data)
084.??????? {
085.??????????? _data = data;
086.??????? }
087.?
088.??????? /// <summary>
089.??????? /// 發(fā)送數(shù)據(jù)。
090.??????? /// </summary>
091.??????? /// <param name="url">要發(fā)送到的Url路徑字符串。</param>
092.??????? /// <returns>true 表示發(fā)送成功,false 發(fā)送失敗。</returns>
093.??????? public bool ExecuteSend(string url)
094.??????? {
095.??????????? return ExecuteSend("POST", url);
096.??????? }
097.??????? /// <summary>
098.??????? /// 發(fā)送數(shù)據(jù)。
099.??????? /// </summary>
100.??????? /// <param name="url">要發(fā)送到的 url 路徑字符串。</param>
101.??????? /// <param name="method">發(fā)送方式。</param>
102.??????? /// <returns>true 表示發(fā)送成功,false 發(fā)送失敗。</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 = "請(qǐng)求頁(yè)面有異常(XMLHTTP.status=" + xmlHttp.status + ")。";
118.??????????????? }
119.??????????? }
120.??????????? else
121.??????????? {
122.??????????????? _error = "請(qǐng)求頁(yè)面有異常(XMLHTTP.readyState=" + xmlHttp.readyState + ")。";
123.??????????? }
124.??????????? return b;
125.??????? }
126.??? }
127.??? #endregion
128.?
129.??? #region Incept:處理 XML 數(shù)據(jù)的接收。
130.??? /// <summary>
131.??? /// 處理 XML 數(shù)據(jù)的接收。
132.??? /// </summary>
133.??? public static class Incept
134.??? {
135.??????? /// <summary>
136.??????? /// 獲取接收的數(shù)據(jù)包,并使用指定的編碼對(duì)數(shù)據(jù)包進(jìn)行解碼。
137.??????? /// </summary>
138.??????? /// <returns>數(shù)據(jù)包的字符串形式。</returns>
139.??????? public static string ExecuteIncept()
140.??????? {
141.??????????? return ExecuteIncept(Encoding.GetEncoding("utf-8"));
142.??????? }
143.??????? /// <summary>
144.??????? /// 獲取接收的數(shù)據(jù)包,并使用指定的編碼對(duì)數(shù)據(jù)包進(jìn)行解碼。
145.??????? /// </summary>
146.??????? /// <param name="encode">與首選編碼相對(duì)應(yīng)的代碼頁(yè)值。</param>
147.??????? /// <returns>數(shù)據(jù)包的字符串形式。</returns>
148.??????? public static string ExecuteIncept(int encode)
149.??????? {
150.??????????? return ExecuteIncept(Encoding.GetEncoding(encode));
151.??????? }
152.??????? /// <summary>
153.??????? /// 獲取接收的數(shù)據(jù)包,并使用指定的編碼對(duì)數(shù)據(jù)包進(jìn)行解碼。
154.??????? /// </summary>
155.??????? /// <param name="encode">字符編碼的名稱(chēng)。</param>
156.??????? /// <returns>數(shù)據(jù)包的字符串形式。</returns>
157.??????? public static string ExecuteIncept(string encode)
158.??????? {
159.??????????? return ExecuteIncept(Encoding.GetEncoding(encode));
160.??????? }
161.??????? /// <summary>
162.??????? /// 獲取接收的數(shù)據(jù)包,并使用指定的編碼對(duì)數(shù)據(jù)包進(jìn)行解碼。
163.??????? /// </summary>
164.??????? /// <param name="encode">字符編碼對(duì)象實(shí)例。</param>
165.??????? /// <returns>數(shù)據(jù)包的字符串形式。</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 數(shù)據(jù)的返回。
175.??? /// <summary>
176.??? /// 處理 XML 數(shù)據(jù)的返回。
177.??? /// </summary>
178.??? public static class Return
179.??? {
180.??????? /// <summary>
181.??????? /// 返回 XML 數(shù)據(jù)包。
182.??????? /// </summary>
183.??????? /// <param name="body">要返回的 XML 的字符串表現(xiàn)形式。</param>
184.??????? public static void ExecuteReturn(string body)
185.??????? {
186.??????????? ExecuteReturn(body, "utf-8");
187.??????? }
188.??????? /// <summary>
189.??????? /// 返回 XML 數(shù)據(jù)包。
190.??????? /// </summary>
191.??????? /// <param name="body">要返回的 XML 的字符串表現(xiàn)形式。</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.}
如果你已經(jīng)讀過(guò)上一篇:ASP之SOAP的發(fā)送、接收與處理類(lèi) ,那么你現(xiàn)在已經(jīng)知道如何使用這三個(gè)類(lèi)了。很簡(jiǎn)單,創(chuàng)建Send發(fā)送類(lèi),并發(fā)送XML數(shù)據(jù)包,在接收站點(diǎn)中,創(chuàng)建Incept接收包,并讀取和處理發(fā)送站點(diǎn)傳遞過(guò)來(lái)的數(shù)據(jù)包,然后再創(chuàng)建Return返回類(lèi),并返回(打印)數(shù)據(jù)包,最后在發(fā)送站點(diǎn)中讀取這個(gè)返回包并處理,OK了。。這就是SOAP流程。
?
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xz2001/archive/2009/05/31/4228582.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/ddlzq/archive/2009/11/24/1609821.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的ASP.NET之SOAP的发送、接收与处理类 [转载]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [ZZ]职场白领必读:《如何成为PPT高
- 下一篇: UNREFERENCED_PARAMET