C# 动态调取 soap 接口
调用示例
- string url = "http://localhost:8080/server/PatientService.asmx";
Hashtable ht = new Hashtable();
ht.Add("start_time", starttime);
XmlDocument xx = WebServiceCaller.QueryGetWebService(url, soapmethod, ht);
实现方法类
- /// <summary>
- /// 利用WebRequest/WebResponse进行WebService调用的类
- /// </summary>
- public class WebServiceCaller
- {
- #region Tip:使用说明
- //webServices 应该支持Get和Post调用,在web.config应该增加以下代码
- //<webServices>
- // <protocols>
- // <add name="HttpGet"/>
- // <add name="HttpPost"/>
- // </protocols>
- //</webServices>
- //调用示例:
- //Hashtable ht = new Hashtable(); //Hashtable 为webservice所需要的参数集
- //ht.Add("str", "test");
- //ht.Add("b", "true");
- //XmlDocument xx = WebSvcCaller.QuerySoapWebService("http://localhost:81/service.asmx", "HelloWorld", ht);
- //MessageBox.Show(xx.OuterXml);
- #endregion
- /// <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 soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
- //XmlElement soapMethod = doc.createElement_x_x(MethodName);
- XmlElement soapMethod = doc.CreateElement(MethodName);
- soapMethod.SetAttribute("xmlns", XmlNs);
- foreach (string k in Pars.Keys)
- {
- //XmlElement soapPar = doc.createElement_x_x(k);
- 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);
- }
- 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 = ;
- }
- private static void WriteRequestData(HttpWebRequest request, byte[] data)
- {
- request.ContentLength = data.Length;
- Stream writer = request.GetRequestStream();
- writer.Write(data, , 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 > )
- {
- 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);
- }
- private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
- }
C# 动态调取 soap 接口的更多相关文章
- C#动态webservice调用接口 (JAVA,C#)
C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- c#动态调用WEBSERVICE接口
C#动态webservice调用接口 1 using System; 2 using System.Collections; 3 using System.IO; 4 using System.Net ...
- C#动态调用WCF接口,两种方式任你选。
写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...
- PHP调用内容DES加密的SOAP接口
本文以方倍工作室优惠券接口开发为例,介绍PHP下DES加解密及SOAP接口调用的实现过程. 一.基础概念 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加 ...
- 动态调用wcf接口服务
1.url:http://localhost:8002/名称.svc/basic(.svc结尾) 2.需要引用的命名空间System.ServiceModel 3.调用代码: public class ...
- SSH动态查询封装接口介绍
SSH动态查询封装接口介绍 1.查询记录总条数 public int count(Class c,Object[][] eq,Object[][] like,String[] group,String ...
- C#动态调用WCF接口
C#动态调用WCF接口 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项 ...
- 记一次.net core调用SOAP接口遇到的问题
背景 最近需要将一些外部的Web Service及其他SOAP接口的调用移到一个独立的WebAPI项目中,然后供其他.Net Core项目调用.之前的几个Web Service已经成功迁 ...
随机推荐
- The goal you specified requires a project to execute but there is no POM in this directory
[INFO] Scanning for projects... [INFO] ------------------------------------------------------------- ...
- SpringCloud——服务网关
1.背景 上篇博客<SpringCloud--Eureka服务注册和发现>中介绍了注册中心Eureka.服务提供者和服务消费者.这篇博客我们将介绍服务网关. 图(1) 未使用服务网关的做法 ...
- 【前端学习笔记04】JavaScript数据通信Ajax方法封装
//Ajax 方法封装 //设置数据格式 function setData(data){ if(!data){ return ''; } else{ var arr = []; for(k in da ...
- 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流
题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...
- 【JavaScript&jQuery】省市区三级联动
HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...
- 【转】小心stringstream.str()字符串用法的陷阱
--------------------- 作者:心中那自由的世界 来源:CSDN 原文:https://blog.csdn.net/119365374/article/details/7744678 ...
- 创建Django的App
一. 新建1个App,命令:python manage.py startapp lib 1. 打开终端 2. 新建 3. 把业务代码放到每一个APP里面就更专业了. 修改urls里面的代码如下: 运行 ...
- [BJWC2011]元素 线性基
题面 题面 题解 一个方案合法,当且仅当选取的01串凑不出0. 因此就是要使得选取的01串全在线性基内,具体原因可以看这道题:[CQOI2013]新Nim游戏 线性基 要使得魔力值最大,只需要按法力值 ...
- 【BZOJ2879】【NOI2012】美食节(费用流)
[BZOJ2879][NOI2012]美食节(费用流) 题面 BZOJ 洛谷 题解 一眼就会思路了吧. 把每个厨师拆点,拆分为他最多能要做的菜的个数,即\(\sum p_i\) 然后把每个菜向厨师的每 ...
- ZJOI2018 D1
归途的车上满是悲伤的气息 虽然早就预言到D1会滚粗,但一切都结束之后还是特别难过. 延时15min 50min T1 30pts 1.5h T2 10pts 2.5h T1 50pts 4.5h T3 ...