WebService帮助类改良版,支持多webservice
帮助类代码
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Web.Services.Description;
using System.Xml;
using System.Xml.Serialization; namespace PTool.WebService
{
public class WSCollectionHelper
{
private static object _obj = new object();
private static WSCollectionHelper _ws = null;
private Dictionary<string,object> _wsClassInstanceList = null;
private Type _wsClassType = null;
private List<WSCollectionModel> _paramcollection = null;
public string xmlurl = string.Empty; private bool _lastConn = true;
#region 事件
public event Action<bool> WsConnectionHandle;
#endregion #region 单一实例
private WSCollectionHelper()
{
xmlurl = ConfigurationManager.AppSettings["XmlUrl"].ToString();
if (_paramcollection == null)
{
CreateXml();
}
} private void CreateParaCollectionList(XmlNodeList nodelist)
{
if (nodelist != null)
{
if (_paramcollection == null)
{
_paramcollection = new List<WSCollectionModel>();
}
foreach (XmlNode item in nodelist)
{
WSCollectionModel model = new WSCollectionModel();
if (!DBConvert.IsDBNull(item.Attributes["FunctionName"]))
{
model.Function_name = DBConvert.ToString(item.Attributes["FunctionName"].InnerText);
}
if (!DBConvert.IsDBNull(item.Attributes["ClassName"]))
{
model.Class_name = DBConvert.ToString(item.Attributes["ClassName"].InnerText);
}
if (!DBConvert.IsDBNull(item.Attributes["NameSpace"]))
{
model.Name_space = DBConvert.ToString(item.Attributes["NameSpace"].InnerText);
}
if (!DBConvert.IsDBNull(item.Attributes["WsUrl"]))
{
model.Ws_url = DBConvert.ToString(item.Attributes["WsUrl"].InnerText);
}
_paramcollection.Add(model);
} } } /// <summary>
/// 获取当前实例
/// </summary>
public static WSCollectionHelper CurrentInstance
{
get
{
if (_ws == null)
{
lock (_obj)
{
if (_ws == null)
{
_ws = new WSCollectionHelper();
}
}
}
return _ws;
}
}
#endregion /// <summary>
/// 获取数据
/// </summary>
/// <param name="methodName"></param>
/// <param name="param"></param>
/// <returns></returns>
public object GetData(string methodName, object[] param)
{
try
{
object item = null;
if (_wsClassInstanceList == null)
{
_wsClassInstanceList = new Dictionary<string, object>();
}
WSCollectionModel selectmodel=_paramcollection.Find(x => x.Function_name == methodName);
if (selectmodel != null)
{
object _wsClassInstance = null;
if (!_wsClassInstanceList.ContainsKey(selectmodel.Ws_url))
{
_wsClassInstance = CreateClassInstance(selectmodel.Ws_url, selectmodel.Class_name);
_wsClassInstanceList.Add(selectmodel.Ws_url, _wsClassInstance);
}
else
{
_wsClassInstance = _wsClassInstanceList[selectmodel.Ws_url];
}
System.Reflection.MethodInfo method = _wsClassType.GetMethod(methodName);
item = method.Invoke(_wsClassInstance, param);
if (_lastConn != true && null != WsConnectionHandle)
{
_lastConn = true;
WsConnectionHandle.BeginInvoke(false, null, null);
}
}
return item;
}
catch (Exception e)
{
if (_lastConn != false && null != WsConnectionHandle)
{
_lastConn = false;
WsConnectionHandle.BeginInvoke(false, null, null);
} return null;
}
} public void CreateXml()
{
XMLFileHelper xml = new XMLFileHelper(xmlurl);
XmlNodeList nodelist = xml.GetNodeList("root/wsmodel");
CreateParaCollectionList(nodelist);
} private object CreateClassInstance(string url,string classname)
{
try
{
object _wsClassInstance = null;
// 1. 使用 WebClient 下载 WSDL 信息。
WebClient web = new WebClient(); Stream stream = web.OpenRead(url);
// 2. 创建和格式化 WSDL 文档。
ServiceDescription description = ServiceDescription.Read(stream);
// 3. 创建客户端代理代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
// 指定访问协议。
importer.ProtocolName = "Soap"; // 生成客户端代理。
importer.Style = ServiceDescriptionImportStyle.Client;
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
// 添加 WSDL 文档。
importer.AddServiceDescription(description, null, null);
// 4. 使用 CodeDom 编译客户端代理类。
// 为代理类添加命名空间,缺省为全局空间。
CodeNamespace nmspace = new CodeNamespace();
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace); ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable = false;
parameter.GenerateInMemory = true;
parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll"); CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); if (!result.Errors.HasErrors)
{
Assembly asm = result.CompiledAssembly;
_wsClassType = asm.GetType(classname);
_wsClassInstance = Activator.CreateInstance(_wsClassType);
}
return _wsClassInstance;
}
catch (Exception e)
{
//_wsClassInstance = null;
//_wsClassType = null;
throw e;
} } #region IDisposable
private bool disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
}
disposed = true;
}
}
~WSCollectionHelper()
{
Dispose(false);
}
#endregion
}
}
xml实体WSCollectionModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace PTool.WebService
{
public class WSCollectionModel
{
private string _function_name = string.Empty;
private string _name_space = string.Empty;
private string _class_name = string.Empty;
private string _ws_url = string.Empty; public string Ws_url
{
get
{
return _ws_url;
} set
{
_ws_url = value;
}
} public string Function_name
{
get
{
return _function_name;
} set
{
_function_name = value;
}
} public string Name_space
{
get
{
return _name_space;
} set
{
_name_space = value;
}
} public string Class_name
{
get
{
return _class_name;
} set
{
_class_name = value;
}
}
}
}
WSConfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<root>
<wsmodel FunctionName="WorkRisk" ClassName="HookPlanService" NameSpace="http://tempuri.org/" WsUrl="http://192.168.2.247:8054/HookPlanService.asmx?wsdl"></wsmodel>
<wsmodel FunctionName="WhatchSee" ClassName="HookPlanService" NameSpace="http://tempuri.org/" WsUrl="http://192.168.2.247:8054/HookPlanService.asmx?wsdl"></wsmodel>
<wsmodel FunctionName="UserInfoAccess" ClassName="wsMonitor" NameSpace="http://tempuri.org/" WsUrl="http://10.169.153.40:8082/Access/wsMonitor.asmx?wsdl"></wsmodel>
</root>
调用方式
public static OtherRiskWs<WorkSee> GetWorkSeeInfo(string Date, string sta_name = "")
{
object[] obj = new object[];
obj[] = Date;
obj[] = sta_name;
object o = WSCollectionHelper.CurrentInstance.GetData("WhatchSee", obj);
if (o == null)
{
return null;
}
string strjson = o.ToString();
OtherRiskWs<WorkSee> info = PTool.Ajax.JsonSerializer.Deserializer(strjson, typeof(OtherRiskWs<WorkSee>)) as OtherRiskWs<WorkSee>;
if (info == null)
{
return null;
}
if (info.data == null)
{
return null;
}
return info;
}
WebService帮助类改良版,支持多webservice的更多相关文章
- 解析利用wsdl.exe生成webservice代理类的详解
利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...
- 部署基于JDK的webservice服务类
部署服务端 两个注解(@WebService @WebMethod).一个类(Endpoint) 首先新建JAVA工程ws-server 目录结构如下 在工程里新建一个接口,申明一个方法. packa ...
- WebService对跨域的支持
WebService对跨域的支持 跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源, ...
- C# 利用VS自带的WSDL工具生成WebService服务类
C# 利用VS自带的WSDL工具生成WebService服务类 WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲 ...
- C# 动态调用 webservice 的类
封装这个类是为之后使用 webservice 不用添加各种引用了. using System; using System.Collections.Generic; using System.Compo ...
- .net 代理类(WebService代理类的详解 )
http://hi.baidu.com/654085966/item/53ee8c0f108ad78202ce1b1d -----------转自 客户端调用Web Service的方式我现在知道 ...
- 利用wsdl.exe生成webservice代理类
通常要手动生成WebService代理类需要把一句生成语句,如 wsdl.exe /l:cs /out:D:\Proxy_UpdateService.cs http://localhost:1101 ...
- 跨域以及WebService对跨域的支持
无耻收藏该博主的成果啦!https://www.cnblogs.com/yangecnu/p/introduce-cross-domain.html 通过域验证访问WebService:https:/ ...
- 手动生成WebService代理类
方式一: 手动生成WebService代理类需要把一句生成语句,如 wsdl.exe /l:cs /out:D:/ProxyServices.cs http://localhost/WebServic ...
随机推荐
- 在Debian下利用URLOS快速安装SqlServer2017
SqlServer能在Debian上安装吗?答案是可以!网络上也能找到很多Linux系统下安装SqlServer的相关文章,也许经过一些折腾,你也能成功在Debian中安装sqlserver,但是其中 ...
- 云计算共享组件--Memcache缓存系统(4)
一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...
- 【LeetCode】18、四数之和
题目等级:4Sum(Medium) 题目描述: Given an array nums of n integers and an integer target, are there elements ...
- 【VS开发】浅谈C/C++中的static和extern关键字
一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...
- [转] DLL加载方式
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
- 【STM32】串行通信原理
(1)通信接口背景知识 并行通信: --传输原理:数据各个位同时传输 --优点:速度快 --缺点:占用引脚资源多 串行通信: ...
- powershell 删除7天前的文件
powershell 删除7天前的文件 $today=Get-Date #"今天是:$today" #昨天 #"昨天是:$($today.AddDays(-1))&quo ...
- SpringMVC基础教程
1. 最简单的配置 首先是要有相应的配置文件: 文件内容: <context:component-scan base-package="com.imethsoft.server.*&q ...
- TCP/IP 物理层卷四 -- 数据报与虚电路
一.数据报(Datagram) 1.1 概念 数据报是分组交换的一种,主要向通信子网中的端系统提供无连接的分组交换服务.通信子网的某主机发送一个报文时,无需建立连接,只需在实现高层协议的前提下对数据拆 ...
- 2019年8月23日 星期五(Workerman)
Workerman,高性能socket服务框架 Workerman是什么? Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架. Workerman不是重复造轮子,它不是 ...