WebServiceCaller

 /*  jonney 2015-09-19 */

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using System.Xml.Serialization; namespace Downloader
{
/// <summary>
/// 利用WebRequest/WebResponse进行WebService调用的类
/// </summary>
public class WebServiceCaller
{
/// <summary>
/// 需要WebService支持Get调用
/// </summary>
public static XmlDocument QueryGetWebService(String url, String methodName, Dictionary<string, object> pars)
{
var request = (HttpWebRequest)WebRequest.Create(url + "/" + methodName + "?" + ParsToString(pars));
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
SetWebRequest(request);
return ReadXmlResponse(request.GetResponse());
} /// <summary>
/// 需要WebService支持Post调用
/// </summary>
public static XmlDocument QueryPostWebService(String url, String methodName, Dictionary<string, object> pars)
{
var request = (HttpWebRequest)WebRequest.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调用(Soap),参数Pars为String类型的参数名、参数值
/// </summary>
public static XmlDocument QuerySoapWebService(String url, String methodName, Dictionary<string, object> pars)
{
if (XmlNamespaces.ContainsKey(url + methodName))
{
string[] echo = XmlNamespaces[url + methodName].ToString().Split('`');
string xmlNs = echo[];
string xmlSoapAction = echo[];
return QuerySoapWebService(url, methodName, pars, xmlNs, xmlSoapAction);
}
string soapAction = "";
string nameSpace = GetNamespace(url, methodName, ref soapAction);
return QuerySoapWebService(url, methodName, pars, nameSpace, soapAction);
} /// <summary>
/// 需要WebService支持Post调用,返回Json
/// </summary>
public static string QueryPostWebService(String endPoint, StringBuilder postData)
{
var request = (HttpWebRequest)WebRequest.Create(endPoint);
request.Method = "POST";
request.ContentType = "application/json";
SetWebRequest(request);
byte[] data = Encoding.UTF8.GetBytes(postData.ToString());
WriteRequestData(request, data);
return ReadTxtResponse(request.GetResponse());
} /// <summary>
/// 需要WebService支持Post调用,返回字节流
/// </summary>
public static byte[] QueryPostWebService(String endPoint, string postData)
{
var request = (HttpWebRequest)WebRequest.Create(endPoint);
request.Method = "POST";
request.ContentType = "application/json";
SetWebRequest(request);
byte[] data = Encoding.UTF8.GetBytes(postData);
WriteRequestData(request, data); using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format(CultureInfo.CurrentCulture, "Request failed. Received HTTP {0}", response.StatusCode);
throw new WebException(message);
}
using (var result = new MemoryStream())
{
const int bufferLen = ;
var buffer = new byte[bufferLen];
using (var responseStream = response.GetResponseStream())
{
var len = responseStream.Read(buffer, , bufferLen);
while (len > )
{
result.Write(buffer, , len);
len = responseStream.Read(buffer, , bufferLen);
}
}
return result.ToArray();
}
}
} private static XmlDocument QuerySoapWebService(String url, String methodName, Dictionary<string, object> pars, string xmlNs, string soapAction)
{
XmlNamespaces[url + methodName] = xmlNs + "`" + soapAction;//加入缓存,提高效率
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8;";
string temSoapAction = "\"" + soapAction + "\"";
request.Headers.Add("SOAPAction", temSoapAction);
SetWebRequest(request);
byte[] data = EncodeParsToSoap(pars, xmlNs, methodName);
WriteRequestData(request, data);
var doc2 = new XmlDocument();
XmlDocument doc = ReadXmlResponse(request.GetResponse());
var mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
var xmlNode = doc.SelectSingleNode("//soap:Body/*", mgr);
if (xmlNode != null)
{
String retXml = xmlNode.InnerXml;
doc2.LoadXml("<root>" + retXml + "</root>");
}
else throw new SystemException("Get soap:Body null");
AddDelaration(doc2);
return doc2;
} private static string GetNamespace(String url, string method, ref string pSoapAction)
{
var doc = new XmlDocument();
var request = (HttpWebRequest)WebRequest.Create(url + "?wsdl");
SetWebRequest(request);
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format(CultureInfo.CurrentCulture, "Request failed. Received HTTP {0}", response.StatusCode);
throw new SystemException(message);
}
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
{
using (var sr = new StreamReader(responseStream, Encoding.UTF8))
{
doc.LoadXml(sr.ReadToEnd());
}
}
else throw new SystemException("GetNamespace url error");
}
}
var xmlNode = doc.SelectSingleNode("//@targetNamespace");
XmlNodeList soapActionList = doc.SelectNodes("//@soapAction");
if (soapActionList!=null)
{
for (int i = ; i < soapActionList.Count; i++)
{
var item = soapActionList.Item(i);
if (item != null && item.Value.EndsWith("/" + method))
{
pSoapAction = item.Value;
}
}
}
if (xmlNode != null)
return xmlNode.Value;
throw new SystemException("GetNamespace xmlNode null");
} private static byte[] EncodeParsToSoap(Dictionary<string, object> pars, String xmlNs, String methodName)
{
var 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);
if (doc.DocumentElement != null) doc.DocumentElement.AppendChild(soapBody);
return Encoding.UTF8.GetBytes(doc.OuterXml);
} private static string ObjectToSoapXml(object o)
{
var doc = new XmlDocument();
var mySerializer = new XmlSerializer(o.GetType());
using (var ms = new MemoryStream())
{
mySerializer.Serialize(ms, o);
doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray(), , (int)ms.Length));
}
if (doc.DocumentElement != null)
{
return doc.DocumentElement.InnerXml;
}
return o.ToString();
} private static void SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = ;
} private static void WriteRequestData(HttpWebRequest request, byte[] data)
{
request.ContentLength = data.Length;
using (Stream writer = request.GetRequestStream())
{
writer.Write(data, , data.Length);
}
} private static byte[] EncodePars(Dictionary<string, object> pars)
{
var sb = new StringBuilder();
sb.Append("{");
foreach (string k in pars.Keys)
{
if (sb.Length > )
{
sb.Append(",");
}
sb.Append("\"" + k + "\"" + ":" + "\"" + pars[k] + "\"");
}
sb.Append("}");
return Encoding.UTF8.GetBytes(sb.ToString());
} private static String ParsToString(Dictionary<string, object> pars)
{
var sb = new StringBuilder();
foreach (string k in pars.Keys)
{
if (sb.Length > )
{
sb.Append("&");
}
sb.Append(k + "=" + pars[k]);
}
return sb.ToString();
} private static XmlDocument ReadXmlResponse(WebResponse resp)
{
var doc = new XmlDocument();
using (var response = (HttpWebResponse)resp)
{
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format(CultureInfo.CurrentCulture, "Request failed. Received HTTP {0}", response.StatusCode);
throw new SystemException(message);
}
using (var responseStream = resp.GetResponseStream())
{
if (responseStream != null)
using (var sr = new StreamReader(responseStream, Encoding.UTF8))
{
doc.LoadXml(sr.ReadToEnd());
}
}
}
return doc;
} private static string ReadTxtResponse(WebResponse resp)
{
using (var response = (HttpWebResponse)resp)
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format(CultureInfo.CurrentCulture, "Request failed. Received HTTP {0}", response.StatusCode);
throw new SystemException(message);
}
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var sr = new StreamReader(responseStream, Encoding.UTF8))
{
responseValue = sr.ReadToEnd();
}
}
return responseValue;
}
} private static void AddDelaration(XmlDocument doc)
{
XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.InsertBefore(decl, doc.DocumentElement);
} private static readonly Hashtable XmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
}
}

WebServiceCaller的更多相关文章

  1. C# 调用webservice 几种办法(转载)

    原文地址: http://www.cnblogs.com/eagle1986/archive/2012/09/03/2669699.html //=========================== ...

  2. C# WebServices中处理XML方式

    1.企业系统集成的时候,大量的字段是很麻烦处理的,用Format 的方式可快速处理 string sql = @"SELECT * FROM table WHERE TASKID='&quo ...

  3. 调用webservice 总结

    最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice . 我们都知道,调用webserivice 最简单的方法就是在 "引用" ...

  4. 使用vs2010创建、发布、部署、调用 WebService

    原文地址:使用vs2010创建.发布.部署.调用 WebService作者:吴超 一 使用vs2010创建 WebService 1 打开VS2010,菜单    文件->新建->项目2 ...

  5. C#动态webservice调用接口 (JAVA,C#)

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...

  6. .net 调用webservice 总结

    最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice . 我们都知道,调用webserivice 最简单的方法就是在 "引用" ...

  7. asp.net访问WebService的各种方式

    WebService的访问形式主要有:SOAP调用.XMLHTTP POST.GET调用.MicroSoft.XMLDOMC调用.webbehavior.htc调用 我们知道的在C#后台本地调用Web ...

  8. WebService 调用三种方法

    //来源:http://www.cnblogs.com/eagle1986/archive/2012/09/03/2669699.html 最近做一个项目,由于是在别人框架里开发app,导致了很多限制 ...

  9. webservice的两种调用方式

    如下 using ConsoleApplication1.TestWebService; using System; using System.Collections; using System.Co ...

随机推荐

  1. File缓存

    /**      * 保存对象      * @param ser      * @param file      * @throws IOException      */     public b ...

  2. Java - 简单的对象排序 - Comparator

    注:对象排序,就是对对象中的某一字段进行比较,以正序或倒序进行排序. 例: 需要排序的对象: public class Person { public int age; public String n ...

  3. 项目中使用oracle序列

    在数据库设计的时候我们可以将表的ID定义为String 然后我们可以使用序列来得到唯一的ID 手写一个mapper: <?xml version="1.0" encoding ...

  4. Objective-C学习笔记-第一天(1)

    .h头文件,用于声明一些公开的属性.方法.头文件一般不会放太多的东西,没必要暴露太多接口,私有和封装. .m主文件,用于实现.h文件中的方法,以及一些其它的方法. -(返回值)方法名参数1名称:(参数 ...

  5. Java EE注册三部曲(一步曲)

    一步曲(html+servlet+SQL+Bean+Dao+加密(Base64)) 设计思路: 1:编写前台页面jsp:register.jsp,使得用户能够实行注册操作 2:编写servlet:re ...

  6. linux信号处理时机

    信号号称所谓软中断,事实上,还是没有真正的硬件中断那样能随时改变cpu的执行流 硬件中断之所以能一发生就得到处理是因为处理器在每个指令周期的结尾都会去检查中断,这种粒度是很细的 但是信号的实现只是在进 ...

  7. node.js学习笔记【1】

    http://howtonode.org/how-to-install-nodejs http://www.mcclean-cooper.com/valentino/cygwin_install/

  8. javascript笔记7-事件

    主要讲事件流.事件捕获.事件冒泡.事件处理程序.事件属性.事件类型.内存和优化等. 由于本文已经在微信订阅号上发布,为了防止原创性冲突检测,因此本文在此处已经删除. 详细请扫描订阅号二维码,查看历史信 ...

  9. Qt开发环境中使用报表控件FastReport遇到的一些问题(一)

    FastReport是一款优秀的报表控件,由俄罗斯开发,国内有代理商.Qt环境下可实现报表功能的还有一款叫NCReport,也是收费控件,比较来比较去还是觉得前者功能强点.网上讲解此控件在Qt中使用的 ...

  10. Struts 2之动态方法调用,不会的赶紧来

    学习Struts2框架以来为了减少Action 的数量,我们可以使用动态方法进行处理. 动态方法调用(Dynamic Method Invocation,DMI)是指表单元素的Action并不是直接等 ...