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. do while(false)实用技巧

    今天看项目源码的时候发现有些地方用了do{} while(false)的用法,查了下发现这样确实有些优点,mark下. 1.最重要的优点,用在略微复杂的宏定义中. #define AB1 a; b; ...

  2. Security » Authorization » 基于角色的授权

    Role based Authorization¶ 基于角色的授权 133 of 153 people found this helpful When an identity is created i ...

  3. MySQL drop、delete和truncate的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 d ...

  4. 简单研究Android View绘制一 测量过程

    2015-07-27 16:52:58 一.如何通过继承ViewGroup来实现自定义View?首先得搞清楚Android时如何绘制View的,参考Android官方文档:How Android Dr ...

  5. C++ explicit关键字应用方法详解

    C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用.我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字.下面就让我们一起来看看这方面的知识吧. C++ ...

  6. 结构体类型定义(C语言)

    结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种:1.先定义结构体,再定义变量: eg. struct student{ char name[10]; ...

  7. ubuntu 配置JDK环境

    /etc/profile中加入以下代码 JAVA_HOME为JDK包解压的路径export JAVA_HOME=/home/exayong/jvm/jdk1.8.0_111 export JRE_HO ...

  8. OC之160728

    NSData与NSMutableData:代表数据缓冲区有两个作用,将数据读入NSData和输出NSData数据 输出 将字符串写入指定文件 用NSFileManager:为创建,删除,移动,复制文件 ...

  9. Android控件— — —ImageView

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  10. php中json_encode UTF-8中文乱码问题

    最近在接口代码当中用到过json_encode,在网上找到说json_encode编码设置为UTF-8中文就不会乱码,经验证这办法确实是有效果的,但是不知道为什么,代码在用过一段时间之后就不太管用了. ...