当前位置:编程学习 > C#/ASP.NET >>

动态调用web服务

麻烦各位大大看下下面的代码,在编译代理类时出现Microsoft中不包含web的引用错误

//动态调用web服务

public static object InvokeWebService(string url, string methodname, object[] args)

{

return WebServiceHelper.InvokeWebService(url ,null ,methodname ,args) ;

}


public static object InvokeWebService(string url, string classname, string methodname, object[] args)

{

string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ;

if((classname == null) ||(classname == ""))

{

classname = WebServiceHelper.GetWsClassName(url) ;

}


try

{

//获取WSDL

WebClient wc = new WebClient();

Stream stream = wc.OpenRead(url+"?WSDL");

ServiceDescription sd = ServiceDescription.Read(stream);

ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();

sdi.AddServiceDescription(sd,"","");

CodeNamespace cn = new CodeNamespace(@namespace);


//生成客户端代理类代码

CodeCompileUnit ccu = new CodeCompileUnit();

ccu.Namespaces.Add(cn);

sdi.Import(cn ,ccu); 

CSharpCodeProvider csc = new CSharpCodeProvider();

ICodeCompiler icc = csc.CreateCompiler();


//设定编译参数

CompilerParameters cplist = new CompilerParameters();

cplist.GenerateExecutable = false;

cplist.GenerateInMemory = true;

cplist.ReferencedAssemblies.Add("System.dll");

cplist.ReferencedAssemblies.Add("System.XML.dll");

cplist.ReferencedAssemblies.Add("System.Web.Services.dll");

cplist.ReferencedAssemblies.Add("System.Data.dll");


//编译代理类

CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);

if(true == cr.Errors.HasErrors)

{

System.Text.StringBuilder sb = new System.Text.StringBuilder();

foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)

{

sb.Append(ce.ToString());

sb.Append(System.Environment.NewLine);

}

throw new Exception(sb.ToString());

}


//生成代理实例,并调用方法

System.Reflection.Assembly assembly = cr.CompiledAssembly;

Type t = assembly.GetType(@namespace+"."+classname,true,true);

object obj = Activator.CreateInstance(t);

System.Reflection.MethodInfo mi = t.GetMethod(methodname);


return mi.Invoke(obj,args);

}

catch(Exception ex)

{

throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));

}

}


private static string GetWsClassName(string wsUrl)

{

string[] parts = wsUrl.Split('/') ;

string[] pps = parts[parts.Length-1].Split('.') ;


return pps[0] ;

}
--------------------编程问答-------------------- 不包含引用就加上引用啊,System.Web
--------------------编程问答-------------------- 你动态加入的dll,你必须有才行,另外代码中如果编译时提示,那么你就要在项目-引用上右键,选择要用到的dll,加进来,比如 System.web.dll,然后在代码中using System.Web --------------------编程问答-------------------- 我都加了,不管是引用还是using都写了,还是会报命名空间“Microsoft”中不存在类型或命名空间名称“Web”(是缺少程序集引用吗?)
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,