asp.net中 GET/POST/SOAP方式调用WebService实现方法

GET与POST区别
HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST(Ajax开发,关心的只有GET请求和POST请求)。

GET与POST方法有以下区别:

(1)   在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。

(2)   GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

(3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

(4)   安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了。

 代码如下 复制代码
using System;   
using System.Web;   
using System.Xml;   
using System.Collections;   
using System.Net;   
using System.Text;   
using System.IO;   
using System.Xml.Serialization;   
    
/// <summary>   
///  利用WebRequest/WebResponse进行WebService调用的类   
/// </summary>   
public class WebSvcCaller   
{   
    //<webServices>   
    //  <protocols>   
    //    <add name="HttpGet"/>   
    //    <add name="HttpPost"/>   
    //  </protocols>   
    //</webServices>   
    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));   
        }   
    }   
    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;   
    }   
    private static string GetNamespace(String URL)   
    {   
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");   
        SetWebRequest(request);   
        WebResponse response = request.GetResponse();   
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);   
        XmlDocument doc = new XmlDocument();   
        doc.LoadXml(sr.ReadToEnd());   
        sr.Close();   
        return doc.SelectSingleNode("//@targetNamespace").Value;   
    }   
    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_x_x("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");   
        XmlElement soapMethod = doc.createElement_x_x(MethodName);   
        soapMethod.SetAttribute("xmlns", XmlNs);   
        foreach (string k in Pars.Keys)   
        {   
            XmlElement soapPar = doc.createElement_x_x(k);   
            soapPar.InnerXml = ObjectToSoapXml(Pars[k]);   
            soapMethod.AppendChild(soapPar);   
        }   
        soapBody.AppendChild(soapMethod);   
        doc.DocumentElement.AppendChild(soapBody);   
        return Encoding.UTF8.GetBytes(doc.OuterXml);   
    }   
    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();   
        }   
    }   
    private static void SetWebRequest(HttpWebRequest request)   
    {   
        request.Credentials = CredentialCache.DefaultCredentials;   
        request.Timeout = 10000;   
    }   
    private static void WriteRequestData(HttpWebRequest request, byte[] data)   
    {   
        request.ContentLength = data.Length;   
        Stream writer = request.GetRequestStream();   
        writer.Write(data, 0, data.Length);   
        writer.Close();   
    }   
    private static byte[] EncodePars(Hashtable Pars)   
    {   
        return Encoding.UTF8.GetBytes(ParsToString(Pars));   
    }   
    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();   
    }   
    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;   
    }   
    private static void AddDelaration(XmlDocument doc)   
    {   
        XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);   
        doc.InsertBefore(decl, doc.DocumentElement);   
    }   

  

调用示例:

 代码如下 复制代码

Hashtable ht = new Hashtable();   
ht.Add("str", "test");   
ht.Add("b", "true");   
XmlDocument xx = WebSvcCaller.QuerySoapWebService("http://localhost:81/service.asmx", "HelloWorld", ht);   
MessageBox.Show(xx.OuterXml);   

这个类有三个公用的方法:QuerySoapWebService为通用的采用Soap方式调用WebService,QueryGetWebService采用GET方式调用,QueryPostWebService采用POST方式调用,后两个方法需要WebService服务器支持相应的调用方式。三个方法的参数和返回值相同:URL为Webservice的Url地址(以.asmx结尾的);MethodName为要调用的方法名称;Pars为参数表,它的Key为参数名称,Value为要传递的参数的值,Value可为任意对象,前提是这个对象可以被xml序列化。注意方法名称、参数名称、参数个数必须完全匹配才能正确调用。第一次以Soap方式调用时,因为需要查询WSDL获取xmlns,因此需要时间相对长些,第二次调用不用再读WSDL,直接从缓存读取。这三个方法的返回值均为XmlDocument对象,这个返回的对象可以进行各种灵活的操作。最常用的一个SelectSingleNode方法,可以让你一步定位到Xml的任何节点,再读取它的文本或属性。也可以直接调用Save保存到磁盘。采用Soap方式调用时,根结点名称固定为root。

这个类主要是利用了WebRequest/WebResponse来完成各种网络查询操作。为了精简明了,这个类中没有添加错误处理,需要在调用的地方设置异常捕获。
下面是一个调用实例:

 代码如下 复制代码
protected void Page_Load(object sender , EventArgs e)   
    ...{   
        try  
        ...{   
            Hashtable pars = new Hashtable();   
            String Url = "http://www.260dns.cn/Services/Weather.asmx";   
            pars["city"] = "上海";   
            pars["wdate"]="2008-3-19";   
            XmlDocument doc = WebSvcCaller.QuerySoapWebService(Url , "GetWeather" , pars);   
            Response.Write(doc.OuterXml);   
        }   
        catch (Exception ex)   
        ...{   
            Response.Write(ex.Message);   
        }   
    }   
时间: 2024-08-03 18:46:02

asp.net中 GET/POST/SOAP方式调用WebService实现方法的相关文章

asp.net中jquery $.ajax实现数据调用实现

最近在ASP.NET中做了一个AJAX调用 : Client端先从ASP.NET Server后台取到一个页面模板,然后在页面初始化时再从Server中取一些相关数据以实现页面模板的动态显示.具体实现为: 1)      Client向 ASP.NET后台发送HTTP GET 请示 2)      后台给Client发送一个HTML模板,同时在内存中存储一个XML  String  (包含页面模板动态显示所需的数据) 3)      Client在初始化页面时,发送AJAX请求,拿到XML St

web service-ajax方式调用WebService

问题描述 ajax方式调用WebService $.ajax({ url:'http://127.0.0.1:6789/hello',type:'post', contentType:'text/xml;charset=utf-8', data:'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ws.demo2/" xmln

php 用自带soap扩展调用webservice。老是报错cannot load from。。

问题描述 php 用自带soap扩展调用webservice.老是报错cannot load from.. 我用的wamp2.5集成环境,php里面的soap扩展也都打开了.却一直无法成功调用webservice,总是报cannot load from的错误. 刚刚卸载了wamp2.5.装了一个wamp2.4,还是不成功,后来又重新安装了wamp2.5,重启了一下电脑,突然就能调用webservic 了.太郁闷了,有大神遇到过同样的问题么. 解决方案 灵异事件经常会碰到,原因神马的已经不重要了,

服务器-利用httpclient传参的方式调用webservice

问题描述 利用httpclient传参的方式调用webservice 其中webservice是两个短信平台(科尚和testin)的整合,在调用科尚时能够正常使用,可是调用testin的时候显示服务器内部出错. 解决方案 很明显是对方服务器异常 解决方案二: 需要查看服务器的具体日志,定界是客户端传参问题还是服务端逻辑问题.

ASP.NET中GridView 重复表格列合并的实现方法_实用技巧

这几天做一个项目有用到表格显示数据的地方,客户要求重复的数据列需要合并,就总结了一下GridView 和 Repeater 关于重复数据合并的方法. 效果图如下: GridView : 前台代码 : <div> <asp:GridView ID="gvIncome" runat="server" AutoGenerateColumns="False"> <Columns> <asp:TemplateFie

Java Axis2 的 RPC 方式调用 webservice 接口 传递对象参数 服务器端接收参数值为NULL

问题描述 JavaAxis2的RPC方式调用webservice接口传递对象参数(其他形式的参数没有试过)时,服务器端可接收到访问,但参数值为null.请问大家有没有遇到过这样的问题,又是怎么解决的??? 解决方案 解决方案二:对方的webservice是document风格的吗?

C# 调用WebService的方法

原文:C# 调用WebService的方法 很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理.更多的内容可以看下面的两个地址:http://blog.csdn.net/limlimlim/article/details/8651043 http://www.cnblogs.com/VisualStudio/archive/2008/10/29/1322228.html 1

PHP使用SOAP扩展实现WebService的方法_php技巧

本文实例讲述了PHP使用SOAP扩展实现WebService的方法.分享给大家供大家参考,具体如下: 最近在一个PHP项目中对接外部接口涉及到WebService,搜索引擎上相关文章不是很多,找到的大都是引用一个号称很强大的开源软件NuSOAP(下载地址:http://sourceforge.net/projects/nusoap/),即一些类.文章写描述的环境是PHP 4.3,现在都流行PHP 5.2或PHP 5.3了.先拿来试试,运行出错,原来NuSOAP提供的soapclient类与PHP

Android开发调用WebService的方法示例

本文实例讲述了Android开发调用WebService的方法.分享给大家供大家参考,具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Andr