大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > C# 动态调用WebService

C# 动态调用WebService

关键词:WebServiceC#动态调用  阅读(899) 赞(15)

[摘要]本文是对C# 动态调用WebService的讲解,对学习C#编程技术有所帮助,与大家分享。

动态调用webservice,就可以不用添加web引用了,上线的话也只是需要改一下wsdl地址就可以了

1.动态调用的方法:

C#代码
///<summary>
 ///动态webservice调用
///</summary>
///<returns>string</returns>
publicstringwsTest()
{
stringurl="http://localhost:8080/myWebserviceTest/services/myServices?wsdl";//wsdl地址
stringname="wsTest";//javaWebService开放的接口
WebServiceProxywsd=newWebServiceProxy(url,name);

string[]str={"测试c#调用java的webService","HelloWebService"};

stringsuc=(string)wsd.ExecuteQuery(name,str);

returnsuc;
}


2.动态调用具体类:

C#代码
usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
usingSystem.Xml.Linq;


usingSystem.IO;
usingSystem.Net;
usingSystem.CodeDom;
usingSystem.CodeDom.Compiler;
usingSystem.Web.Services.Description;
usingSystem.Xml.Serialization;
usingSystem.Web.Services.Discovery;
usingSystem.Xml.Schema;
usingSystem.Text;
usingSystem.Security.Cryptography;
usingSystem.Reflection;
usingSystem.Collections.Generic;
usingSystem.Xml;

namespaceTPSVService
{
///<summary>
 ///WebServiceProxy的摘要说明
///</summary>
[WebService(Namespace="http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
//若要允许使用ASP.NETAJAX从脚本中调用此Web服务,请取消对下行的注释。
//[System.Web.Script.Services.ScriptService]
publicclassWebServiceProxy:System.Web.Services.WebService
{

#region私有变量和属性定义
///<summary>
 ///web服务地址
///</summary>
privatestring_wsdlUrl=string.Empty;
///<summary>
 ///web服务名称
///</summary>
privatestring_wsdlName=string.Empty;
///<summary>
 ///代理类命名空间
///</summary>
privatestring_wsdlNamespace="FrameWork.WebService.DynamicWebServiceCalling.{0}";
///<summary>
 ///代理类类型名称
///</summary>
privateType_typeName=null;
///<summary>
 ///程序集名称
///</summary>
privatestring_assName=string.Empty;
///<summary>
 ///代理类所在程序集路径
///</summary>
privatestring_assPath=string.Empty;
///<summary>
 ///代理类的实例
///</summary>
privateobject_instance=null;
///<summary>
 ///代理类的实例
///</summary>
privateobjectInstance
{
get
{
if(_instance==null)
{
_instance=Activator.CreateInstance(_typeName);
return_instance;
}
else
return_instance;
}
}
#endregion

#region构造函数
publicWebServiceProxy(stringwsdlUrl)
{

this._wsdlUrl=wsdlUrl;
stringwsdlName=WebServiceProxy.getWsclassName(wsdlUrl);
this._wsdlName=wsdlName;
this._assName=string.Format(_wsdlNamespace,wsdlName);
this._assPath=Path.GetTempPath()+this._assName+getMd5Sum(this._wsdlUrl)+".dll";
this.CreateServiceAssembly();
}

publicWebServiceProxy(stringwsdlUrl,stringwsdlName)
{
this._wsdlUrl=wsdlUrl;
this._wsdlName=wsdlName;
this._assName=string.Format(_wsdlNamespace,wsdlName);
this._assPath=Path.GetTempPath()+this._assName+getMd5Sum(this._wsdlUrl)+".dll";
this.CreateServiceAssembly();
}
#endregion

#region得到WSDL信息,生成本地代理类并编译为DLL,构造函数调用,类生成时加载
///<summary>
 ///得到WSDL信息,生成本地代理类并编译为DLL
///</summary>
privatevoidCreateServiceAssembly()
{
if(this.checkCache())
{
this.initTypeName();
return;
}
if(string.IsNullOrEmpty(this._wsdlUrl))
{
return;
}
try
{
//使用WebClient下载WSDL信息
WebClientweb=newWebClient();
Streamstream=web.OpenRead(this._wsdlUrl);
ServiceDescriptiondescription=ServiceDescription.Read(stream);//创建和格式化WSDL文档
ServiceDescriptionImporterimporter=newServiceDescriptionImporter();//创建客户端代理代理类
importer.ProtocolName="Soap";
importer.Style=ServiceDescriptionImportStyle.Client;//生成客户端代理
importer.CodeGenerationOptions=CodeGenerationOptions.GenerateProperties|CodeGenerationOptions.GenerateNewAsync;
importer.AddServiceDescription(description,null,null);//添加WSDL文档
//使用CodeDom编译客户端代理类
CodeNamespacenmspace=newCodeNamespace(_assName);//为代理类添加命名空间
CodeCompileUnitunit=newCodeCompileUnit();
unit.Namespaces.Add(nmspace);
this.checkForImports(this._wsdlUrl,importer);
ServiceDescriptionImportWarningswarning=importer.Import(nmspace,unit);
CodeDomProviderprovider=CodeDomProvider.CreateProvider("CSharp");
CompilerParametersparameter=newCompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll");
parameter.GenerateExecutable=false;
parameter.GenerateInMemory=false;
parameter.IncludeDebugInformation=false;
CompilerResultsresult=provider.CompileAssemblyFromDom(parameter,unit);
provider.Dispose();
if(result.Errors.HasErrors)
{
stringerrors=string.Format(@"编译错误:{0}错误!",result.Errors.Count);
foreach(CompilerErrorerrorinresult.Errors)
{
errors+=error.ErrorText;
}
thrownewException(errors);
}
this.copyTempAssembly(result.PathToAssembly);
this.initTypeName();
}
catch(Exceptione)
{
thrownewException(e.Message);
}
}
#endregion

#region执行Web服务方法
///<summary>
 ///执行代理类指定方法,有返回值
///</summary>
///<paramname="methodName">方法名称</param>
///<paramname="param">参数</param>
///<returns>object</returns>
publicobjectExecuteQuery(stringmethodName,object[]param)
{
objectrtnObj=null;
string[]args=newstring[2];
List<string>list=newList<string>();
List<string>list1=newList<string>();
List<string>list2=newList<string>();
object[]obj=newobject[3];

try
{
if(this._typeName==null)
{
//记录Web服务访问类名错误日志代码位置
thrownewTypeLoadException("Web服务访问类名【"+this._wsdlName+"】不正确,请检查!");
}
//调用方法
MethodInfomi=this._typeName.GetMethod(methodName);
if(mi==null)
{
//记录Web服务方法名错误日志代码位置
thrownewTypeLoadException("Web服务访问方法名【"+methodName+"】不正确,请检查!");
}
try
{
if(param==null)
rtnObj=mi.Invoke(Instance,null);
else{
list.Add("Hello");
list.Add("WebService");
list.Add("!");

list1.Add("I");
list1.Add("am");
list1.Add("test");

list2.Add("do");
list2.Add("it");
list2.Add("now");

obj[0]=list;
obj[1]=list1;
obj[2]=list2;

rtnObj=mi.Invoke(Instance,newobject[]{obj});
//rtnObj=mi.Invoke(Instance,newobject[]{param});
}
}
catch(TypeLoadExceptiontle)
{
//记录Web服务方法参数个数错误日志代码位置
thrownewTypeLoadException("Web服务访问方法【"+methodName+"】参数个数不正确,请检查!",newTypeLoadException(tle.StackTrace));
}
}
catch(Exceptionex)
{
thrownewException(ex.Message,newException(ex.StackTrace));
}
returnrtnObj;
}

///<summary>
///执行代理类指定方法,无返回值
///</summary>
///<paramname="methodName">方法名称</param>
///<paramname="param">参数</param>
publicvoidExecuteNoQuery(stringmethodName,object[]param)
{
try
{
if(this._typeName==null)
{
//记录Web服务访问类名错误日志代码位置
thrownewTypeLoadException("Web服务访问类名【"+this._wsdlName+"】不正确,请检查!");
}
//调用方法
MethodInfomi=this._typeName.GetMethod(methodName);
if(mi==null)
{
//记录Web服务方法名错误日志代码位置
thrownewTypeLoadException("Web服务访问方法名【"+methodName+"】不正确,请检查!");
}
try
{
if(param==null)
mi.Invoke(Instance,null);
else
mi.Invoke(Instance,param);
}
catch(TypeLoadExceptiontle)
{
//记录Web服务方法参数个数错误日志代码位置
thrownewTypeLoadException("Web服务访问方法【"+methodName+"】参数个数不正确,请检查!",newTypeLoadException(tle.StackTrace));
}
}
catch(Exceptionex)
{
thrownewException(ex.Message,newException(ex.StackTrace));
}
}
#endregion

#region私有方法
///<summary>
///得到代理类类型名称
///</summary>
privatevoidinitTypeName()
{
AssemblyserviceAsm=Assembly.LoadFrom(this._assPath);
Type[]types=serviceAsm.GetTypes();
stringobjTypeName="";
foreach(Typetintypes)
{
if(t.BaseType==typeof(SoapHttpClientProtocol))
{
objTypeName=t.Name;
break;
}
}
_typeName=serviceAsm.GetType(this._assName+"."+objTypeName);
}

///<summary>
///根据webservice文档架构向代理类添加ServiceDescription和XmlSchema
///</summary>
///<paramname="baseWSDLUrl">web服务地址</param>
///<paramname="importer">代理类</param>
privatevoidcheckForImports(stringbaseWsdlUrl,ServiceDescriptionImporterimporter)
{
DiscoveryClientProtocoldcp=newDiscoveryClientProtocol();
dcp.DiscoverAny(baseWsdlUrl);
dcp.ResolveAll();
foreach(objectosdindcp.Documents.Values)
{
if(osdisServiceDescription)importer.AddServiceDescription((ServiceDescription)osd,null,null);;
if(osdisXmlSchema)importer.Schemas.Add((XmlSchema)osd);
}
}

///<summary>
///复制程序集到指定路径
///</summary>
///<paramname="pathToAssembly">程序集路径</param>
privatevoidcopyTempAssembly(stringpathToAssembly)
{
File.Copy(pathToAssembly,this._assPath);
}

privatestringgetMd5Sum(stringstr)
{
Encoderenc=System.Text.Encoding.Unicode.GetEncoder();
byte[]unicodeText=newbyte[str.Length*2];
enc.GetBytes(str.ToCharArray(),0,str.Length,unicodeText,0,true);
MD5md5=newMD5CryptoServiceProvider();
byte[]result=md5.ComputeHash(unicodeText);
StringBuildersb=newStringBuilder();
for(inti=0;i<result.Length;i++)
{
sb.Append(result[i].ToString("X2"));
}
returnsb.ToString();
}

///<summary>
///是否已经存在该程序集
///</summary>
///<returns>false:不存在该程序集,true:已经存在该程序集</returns>
privateboolcheckCache()
{
if(File.Exists(this._assPath))
{
returntrue;
}
returnfalse;
}

//私有方法,默认取url入口的文件名为类名
privatestaticstringgetWsclassName(stringwsdlUrl)
{
string[]parts=wsdlUrl.Split('/');
string[]pps=parts[parts.Length-1].Split('.');
returnpps[0];
}
#endregion
}
}


java接口可以用Object[]类型接收参数

创建个c#的webservice应用,可以运行本示例



相关评论