ASP.NET之SOAP的发送、接收与处理类

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


如果你已经读过上一篇:ASP之SOAP的发送、接收与处理类 ,那么你现在已经知道如何使用这三个类了。很简单,创建Send发送类,并发送XML数据包,在接收站点中,创建Incept接收包,并读取和处理发送站点传递过来的数据包,然后再创建Return返回类,并返回(打印)数据包,最后在发送站点中读取这个返回包并处理,OK了。。这就是SOAP流程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值