HttpWebRequest调用web服务的代码

本文介绍了一种使用WebRequest和WebResponse调用WebService的方法,包括POST、GET请求及SOAP协议调用方式。提供了具体的C#实现代码,并解释了如何通过HTTP请求发送参数、接收XML响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Web;
using System.Xml;
using System.Collections;
using System.Net;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace Trade.Unity
{

    
/// <summary>
    
///  利用WebRequest/WebResponse进行WebService调用
    
/// </summary>
    public class WebServiceCaller
    {

        
private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace

        
/// <summary>
        
/// 需要WebService支持Post调用
        
/// </summary>
        public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
        {
            HttpWebRequest request 
= (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
            request.Method 
= "POST";
            request.ContentType 
= "application/x-www-form-urlencoded";
            SetWebRequest(request);
            
byte[] data = EncodePars(Pars);
            WriteRequestData(request, data);

            
return ReadXmlResponse(request.GetResponse());
        }
        
/// <summary>
        
/// 需要WebService支持Get调用
        
/// </summary>
        public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
        {
            HttpWebRequest request 
= (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
            request.Method 
= "GET";
            request.ContentType 
= "application/x-www-form-urlencoded";
            SetWebRequest(request);
            
return ReadXmlResponse(request.GetResponse());
        }
        
/// <summary>
        
/// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
        
/// </summary>
        public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
        {
            
if (_xmlNamespaces.ContainsKey(URL))
            {
                
return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
            }
            
else
            {
                
return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
            }
        }
        
/// <summary>
        
/// 执行webservice里的方法
        
/// </summary>
        
/// <param name="URL">url</param>
        
/// <param name="MethodName">方法名</param>
        
/// <param name="Pars">参数</param>
        
/// <param name="XmlNs"></param>
        
/// <returns></returns>
        private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
        {
            _xmlNamespaces[URL] 
= XmlNs;
            HttpWebRequest request 
= (HttpWebRequest)HttpWebRequest.Create(URL);
            request.Method 
= "POST";
            request.ContentType 
= @"text/xml; charset=utf-8";
            request.Headers.Add(
"SOAPAction""\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
            SetWebRequest(request);
            
byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
            WriteRequestData(request, data);
            XmlDocument doc 
= new XmlDocument(), doc2 = new XmlDocument();
            doc 
= ReadXmlResponse(request.GetResponse());

            XmlNamespaceManager mgr 
= new XmlNamespaceManager(doc.NameTable);
            mgr.AddNamespace(
"soap""http://schemas.xmlsoap.org/soap/envelope/");
            String RetXml 
= doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
            doc2.LoadXml(
"<root>" + RetXml + "</root>");
            AddDelaration(doc2);
            
return doc2;
        }
        
/// <summary>
        
/// 获取webservice WSDL的namespace
        
/// </summary>
        
/// <param name="URL"></param>
        
/// <returns></returns>
        private static string GetNamespace(String URL)
        {
            
string[] strArr = URL.Split('?');
            HttpWebRequest request 
= (HttpWebRequest)WebRequest.Create(strArr[0+ "?WSDL");
            SetWebRequest(request);
            WebResponse response 
= request.GetResponse();
            StreamReader sr 
= new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            XmlDocument doc 
= new XmlDocument();
            
//doc.Load(sr.ReadToEnd());
            doc.Load(sr);
            sr.Close();
            
//string str = sr.ReadToEnd();
            return doc.SelectSingleNode("//@targetNamespace").Value;
            
//return "";
        }
        
/// <summary>
        
/// 将参数等转换成SOAP
        
/// </summary>
        
/// <param name="Pars"></param>
        
/// <param name="XmlNs"></param>
        
/// <param name="MethodName"></param>
        
/// <returns></returns>
        private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
        {
            XmlDocument doc 
= new XmlDocument();
            doc.LoadXml(
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>");
            AddDelaration(doc);
            XmlElement soapBody 
= doc.CreateElement("soap""Body""http://schemas.xmlsoap.org/soap/envelope/");
            XmlElement soapMethod 
= doc.CreateElement(MethodName);
            soapMethod.SetAttribute(
"xmlns", XmlNs);
            
foreach (string k in Pars.Keys)
            {
                XmlElement soapPar 
= doc.CreateElement(k);
                soapPar.InnerXml 
= ObjectToSoapXml(Pars[k]);
                soapMethod.AppendChild(soapPar);
            }
            soapBody.AppendChild(soapMethod);
            doc.DocumentElement.AppendChild(soapBody);
            
return Encoding.UTF8.GetBytes(doc.OuterXml);
        }
        
/// <summary>
        
/// 对象转换成XML
        
/// </summary>
        
/// <param name="o"></param>
        
/// <returns></returns>
        private static string ObjectToSoapXml(object o)
        {
            XmlSerializer mySerializer 
= new XmlSerializer(o.GetType());
            MemoryStream ms 
= new MemoryStream();
            mySerializer.Serialize(ms, o);
            XmlDocument doc 
= new XmlDocument();
            doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
            
if (doc.DocumentElement != null)
            {
                
return doc.DocumentElement.InnerXml;
            }
            
else
            {
                
return o.ToString();
            }
        }
        
/// <summary>
        
/// 设置请求相关属性
        
/// </summary>
        
/// <param name="request"></param>
        private static void SetWebRequest(HttpWebRequest request)
        {
            request.Credentials 
= CredentialCache.DefaultCredentials;
            
//request.Timeout = 10000;
        }
        
/// <summary>
        
/// 发出请求
        
/// </summary>
        
/// <param name="request"></param>
        
/// <param name="data"></param>
        private static void WriteRequestData(HttpWebRequest request, byte[] data)
        {
            request.ContentLength 
= data.Length;
            Stream writer 
= request.GetRequestStream();
            writer.Write(data, 
0, data.Length);
            writer.Close();
        }
        
/// <summary>
        
/// 得到参数字节码
        
/// </summary>
        
/// <param name="Pars"></param>
        
/// <returns></returns>
        private static byte[] EncodePars(Hashtable Pars)
        {
            
return Encoding.UTF8.GetBytes(ParsToString(Pars));
        }
        
/// <summary>
        
/// Hashtable参数转换成字符参数p1=1&p2=2
        
/// </summary>
        
/// <param name="Pars"></param>
        
/// <returns></returns>
        private static String ParsToString(Hashtable Pars)
        {
            StringBuilder sb 
= new StringBuilder();
            
foreach (string k in Pars.Keys)
            {
                
if (sb.Length > 0)
                {
                    sb.Append(
"&");
                }
                sb.Append(HttpUtility.UrlEncode(k) 
+ "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
            }
            
return sb.ToString();
        }
        
/// <summary>
        
/// 从响应流中读取XML
        
/// </summary>
        
/// <param name="response"></param>
        
/// <returns></returns>
        private static XmlDocument ReadXmlResponse(WebResponse response)
        {
            StreamReader sr 
= new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            String retXml 
= sr.ReadToEnd();
            sr.Close();
            XmlDocument doc 
= new XmlDocument();
            doc.LoadXml(retXml);
            
return doc;
        }
        
/// <summary>
        
/// 为XML文件添加声明
        
/// </summary>
        
/// <param name="doc"></param>
        private static void AddDelaration(XmlDocument doc)
        {
            XmlDeclaration decl 
= doc.CreateXmlDeclaration("1.0""utf-8"null);
            doc.InsertBefore(decl, doc.DocumentElement);
        }
    }
}

转载于:https://www.cnblogs.com/leleroyn/archive/2009/02/21/1395403.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值