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. 转:C++中的单例模式

    C++中的单例模式 单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块, ...

  2. svn查看代码作者的命令

    svn blame **.java | grep ** svn查看代码作者的命令

  3. 项目忽然出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法

    0.环境: 新装win8.1系统,Tomcat配置无误. 1.错误: 项目中某一.jps页面忽然出现错误,鼠标点上去为:The superclass "javax.servlet.http. ...

  4. javascript数组常用方法汇总

    1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔数组的各个元素.如果不指定分隔符,默认使 ...

  5. C语言输出时的各种%

    d  以十进制形式输出带符号整数(正数不输出符号) o  以八进制形式输出无符号整数(不输出前缀O) x  以十六进制形式输出无符号整数(不输出前缀OX) u  以十进制形式输出无符号整数 f  以小 ...

  6. python编程技巧2

    模块化 ---- 这是我们程序员梦寐以求的,通过模块化可以避免重复的制造轮子. 同时 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块 ...

  7. C++指针之防不胜防

    我们在使用指针时,经常会出现下面几种错误: 1) 内存分配未成功,却使用了它. 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功.常用解决办法是,在使用内存之前检查指针是否为NULL.如果指针 ...

  8. (转)【深入浅出jQuery】源码浅析2--奇技淫巧

    [深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html

  9. poj 2763 Housewife Wind

    题目链接 分析:这道题是树链剖分的裸题,把边的信息保存在深度大的那个节点上就行了. 一开始写的邻接表,居然TLE了.后来百度发现有人说前向星跑得比较快?我不是很明白,但是改成前向星以后的确快了很多,邻 ...

  10. c运行库冲突问题

    按照网上的方法,各种调试不成功,后来改成用共享MFC的dll,然后回退新加的代码,再把 #include <afxwin.h> #ifndef _AFX_NO_DB_SUPPORT#inc ...