1,静态调用
1,首先你得知道地址 如:http://10.180.0.45:22122/UIPax/TestMethodWsService?wsdl。
3,保存当前页面的数据到.txt文件里。
4, 打开VS。
5,点击引用右键,然后选择“”添加服务器引用“”。
6,点击高级
7,点击添加Web引用
8,URL 填入上面第三点,您保存的.txt文件路径 ,Web 引用名,自己定义一个就行,然后点击添加引用。
9,成功引用,就可以实例化这个引用,调用里面的方法了。
2,动态调用
public static object InvokeWebService02(string url, string methodname, object[] args)
{
//这里的namespace是需引用的webservices的命名空间,也可以加一个参数从外面传进来。
string @namespace = "MyWebserviceTest";
Console.WriteLine("定义命名空间:" + @namespace);
try
{
Console.WriteLine("开始获取wsdl...");
//获取WSDL
WebClient wc = new WebClient();
Console.WriteLine("开始获取流数据...");
Stream stream = wc.OpenRead(url + "?wsdl");ServiceDescription sd = ServiceDescription.Read(stream);
Console.WriteLine("格式化流数据...");
string classname = sd.Services[0].Name;
Console.WriteLine("获取包含在流中的service集合中service[0].name:" + classname);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
Console.WriteLine("建立生成代理类功能类对象的实例...");
sdi.AddServiceDescription(sd, "", "");
sdi.ProtocolName = "SOAP";
Console.WriteLine("配置访问XML的协议为:" + sdi.ProtocolName);
Console.WriteLine("将流数据加入实例中...");
CodeNamespace cn = new CodeNamespace(@namespace);
Console.WriteLine("生成命名空间对象...");
//生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
Console.WriteLine("建立CodeDom容器对象...");
ccu.Namespaces.Add(cn);
Console.WriteLine("为容器添加命名空间...");
sdi.Import(cn, ccu);
Console.WriteLine("将命名空间和容器导入wsdl流中...");
CSharpCodeProvider csc = new CSharpCodeProvider();
Console.WriteLine("建立C#代码生成器和编译器对象...");
//ICodeCompiler icc = csc.CreateCompiler();
//设定编译参数
CompilerParameters cplist = new CompilerParameters();
Console.WriteLine("设置编译参数...");
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");
//这里的字段OutputAssembly可配置也可不配置,配置后下面的编译器对象将按照配置的路径将wsdl生成.dll文件
cplist.OutputAssembly = System.IO.Directory.GetCurrentDirectory() + "\\" + classname + ".dll";
Console.WriteLine("根据编译器对象按照编译参数对象和容器对象设置编译生成代理类对象...");
//编译代理类
CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu);Console.WriteLine("编译完成...");
Console.WriteLine("检测编译是否产生错误...");
if (File.Exists(System.IO.Directory.GetCurrentDirectory() + "\\" + classname + ".dll"))
{
Console.WriteLine(classname + ".dll" + "文件生成...");
}
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());
}Console.WriteLine("开始调用编译完的程序集...");
Console.WriteLine("建立程序集对象...");
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(classname + ".dll");
Type t = assembly.GetType(@namespace + "." + classname, true, true);
Console.WriteLine("获取程序集中" + @namespace + "." + classname + "中的类型对象...");
object obj = Activator.CreateInstance(t);
Console.WriteLine("建立该对象实例..."+obj);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
Console.WriteLine("获取名为" + methodname + "的方法的信息....\n" + mi.ToString());
Console.WriteLine("开始调用该方法...");
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
Console.WriteLine("WebService调用异常,详细信息如下:{0}", ex.ToString());
return null;
}
}
动态调用代码我是复制另外一位博主的(具体是谁忘了)。