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. ios中autolayout

    IOS 6 自动布局 入门-1  Matthijs Hollemans on September 29, 2012 Tweet 这篇文章还可以在这里找到 英语, 韩语, 土耳其语 If you're ...

  2. awakeFromNib与viewDidLoad的区别

    当一个nib文件对应两个类,File's Owner的class为XXXViewController,Objects下的View对应的为XXXView时: awakeFromNib:在XXXView. ...

  3. hadoop输入格式(InputFormat)

    InputFormat接口(package org.apache.hadoop.mapreduce包中)里包括两个方法:getSplits()和createRecordReader(),这两个方法分别 ...

  4. PHP中file_put_contents追加时换行

    很多时候记录日志需要换行.不建议使用\r\n,因为:在windows中\r\n是换行在Mac中\r是换行在Liunx中\n是换行 但是PHP提供了一个常量来匹配不同的操作系统,即: file_put_ ...

  5. nopcommerce 初学2

    好久没有接触nopcommerce了. 2016-9-5  现在最新的是3.8. 这段时间也稍微接触了下aspnet 的mvc. 所以就想到nop是一个开源的 很全得项目, 然后就拆了一些可以学习跟借 ...

  6. UI的一些方法(按钮和线)

    //设置按钮字体颜色 [self.determineBtn setTitleColor:[UIColor colorWithHexString:@"0xff9500"] forSt ...

  7. hdu 2093

    ps:这题的输入我看到括号以为要用字符串,谁知道看了大神的才知道可以这样"scanf("%d(%d)",&a,&b);"  觉得好神奇.. 然后 ...

  8. VG.net矢量图和矢量动画开发平台拓扑图软件免费下载

    VG.net拓扑图软件是一个基于.net平台的矢量图开发工具,可广泛应用于包括:电力.军工.煤炭.化工.科研.能源等各种监控软件.工作流设计器.电力.化工.煤炭.工控组态软件.仿真.地理信息系统.工作 ...

  9. php大力力 [038节] 全栈工程师的含义

    管理时间 http://www.nowamagic.net/librarys/eight/posts/2753 从知乎上看到“全栈开发者”讨论之后的自黑 什么是全栈开发者 https://beeclo ...

  10. JSP应用程序(自定义错误页面)

    一.编写 1.index.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> &l ...