首先本文不对SOAP有过多的解释,你只需知道它是--简单对象访问协议,一种轻量的、简单的、基于 XML 的协议。举个例子,WebService其实就基于SOAP的。
再简单的说一下,SOAP就是打包-->发送-->收包-->处理-->返回包等一系列流程,在ASP.NET中可以使用MSXML2中的XMLHTTPClass类来创建SOAP发送对象,先下载Interop.MSXML2.dll,然后复制到VS项目的bin目录,或者在VS里添加引用。创建如下代码:
#region 引用的命名空间
using System;
using System.IO;
using System.Data;
using System.Web;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using MSXML2;//xmlHttp所属命名空间(添加引用:COM->Microsoft Xml 3.0)
#endregion
namespace Simple.SOAP
{
#region Send:处理 XML 数据的发送。
/// <summary>
/// 处理 XML 数据的发送。
/// </summary>
public class Send
{
/// <summary>
/// XMLHTTP 对象。
/// </summary>
private XMLHTTP xmlHttp = new XMLHTTPClass();
/// <summary>
/// Send 失败后的提示信息。
/// </summary>
private string _error = "";
/// <summary>
/// 发送数据包的字符串表现形式。
/// </summary>
private string _data = "";
/// <summary>
/// Send 返回数据包的字符串表现形式。
/// </summary>
private string _return = "";
/// <summary>
/// 获取或设置发送数据包的字符串表现形式(建议发送XML数据文档的字符串表现形式)。
/// </summary>
public string Data
{
get
{
return _data;
}
set
{
_data = value;
}
}
/// <summary>
/// 获取 Send 返回数据包的字符串表现形式。
/// </summary>
public string Return
{
get
{
return _return;
}
}
/// <summary>
/// 获取 Send 失败后的提示信息。
/// </summary>
public string Error
{
get
{
return _error;
}
}
/// <summary>
/// 初始化 Send 类的新实例。
/// </summary>
public Send()
{
}
/// <summary>
/// 初始化 Send 类的新实例。
/// </summary>
/// <param name="data">要发送数据的字符串表现形式(建议发送 XML 数据文档的字符串表现形式)。</param>
public Send(string data)
{
_data = data;
}
/// <summary>
/// 发送数据。
/// </summary>
/// <param name="url">要发送到的Url路径字符串。</param>
/// <returns>true 表示发送成功,false 发送失败。</returns>
public bool ExecuteSend(string url)
{
return ExecuteSend("POST", url);
}
/// <summary>
/// 发送数据。
/// </summary>
/// <param name="url">要发送到的 url 路径字符串。</param>
/// <param name="method">发送方式。</param>
/// <returns>true 表示发送成功,false 发送失败。</returns>
public bool ExecuteSend(string url, string method)
{
bool b = false;
xmlHttp.open(method, url, false, null, null);
xmlHttp.send(_data);
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
_return = xmlHttp.responseText;
b = true;
}
else
{
_error = "请求页面有异常(XMLHTTP.status=" + xmlHttp.status + ")。";
}
}
else
{
_error = "请求页面有异常(XMLHTTP.readyState=" + xmlHttp.readyState + ")。";
}
return b;
}
}
#endregion
#region Incept:处理 XML 数据的接收。
/// <summary>
/// 处理 XML 数据的接收。
/// </summary>
public static class Incept
{
/// <summary>
/// 获取接收的数据包,并使用指定的编码对数据包进行解码。
/// </summary>
/// <returns>数据包的字符串形式。</returns>
public static string ExecuteIncept()
{
return ExecuteIncept(Encoding.GetEncoding("utf-8"));
}
/// <summary>
/// 获取接收的数据包,并使用指定的编码对数据包进行解码。
/// </summary>
/// <param name="encode">与首选编码相对应的代码页值。</param>
/// <returns>数据包的字符串形式。</returns>
public static string ExecuteIncept(int encode)
{
return ExecuteIncept(Encoding.GetEncoding(encode));
}
/// <summary>
/// 获取接收的数据包,并使用指定的编码对数据包进行解码。
/// </summary>
/// <param name="encode">字符编码的名称。</param>
/// <returns>数据包的字符串形式。</returns>
public static string ExecuteIncept(string encode)
{
return ExecuteIncept(Encoding.GetEncoding(encode));
}
/// <summary>
/// 获取接收的数据包,并使用指定的编码对数据包进行解码。
/// </summary>
/// <param name="encode">字符编码对象实例。</param>
/// <returns>数据包的字符串形式。</returns>
public static string ExecuteIncept(Encoding encode)
{
StreamReader sr = new StreamReader(HttpContext.Current.Request.InputStream, encode);
return sr.ReadToEnd();
}
}
#endregion
#region Return:处理 XML 数据的返回。
/// <summary>
/// 处理 XML 数据的返回。
/// </summary>
public static class Return
{
/// <summary>
/// 返回 XML 数据包。
/// </summary>
/// <param name="body">要返回的 XML 的字符串表现形式。</param>
public static void ExecuteReturn(string body)
{
ExecuteReturn(body, "utf-8");
}
/// <summary>
/// 返回 XML 数据包。
/// </summary>
/// <param name="body">要返回的 XML 的字符串表现形式。</param>
/// <param name="encode">输出字符的编码格式。</param>
public static void ExecuteReturn(string body, string encode)
{
if (!new Regex(@"^<///?xml.*///?>.*$", RegexOptions.IgnoreCase).IsMatch(Regex.Escape(body)))
{
body = "<?xml version=/"1.0/" encoding=/"" + encode + "/" ?>/n" + body;
}
else
{
string start = body.Substring(0, body.IndexOf("/"?>"));
string left = body.Substring(0, start.LastIndexOf("/"") + 1);
body = left + encode + body.Substring(body.IndexOf("/"?>"));
}
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.Charset = encode;
HttpContext.Current.Response.Expires = 0;
HttpContext.Current.Response.Write(body);
HttpContext.Current.Response.End();
}
}
#endregion
}