- /// <summary>
- /// 根据指定的信息,调用远程WebService方法
- /// </summary>
- /// <param name="url">WebService的http形式的地址</param>
- /// <param name="namespace">欲调用的WebService的命名空间</param>
- /// <param name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>
- /// <param name="methodname">欲调用的WebService的方法名</param>
- /// <param name="args">参数列表</param>
- /// <returns>WebService的执行结果</returns>
public class Class1
{
public static object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args)
{
if ((classname == null) || (classname == ""))
{
classname = GetWsClassName(url);
}
try
{
System.Net.WebClient wc = new System.Net.WebClient();
System.IO.Stream stream = wc.OpenRead(url + "?WSDL");
System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);
System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);
System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.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");
System.CodeDom.Compiler.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 (NullReferenceException NullEx)
{
throw NullEx;
}
catch (Exception Ex)
{
throw Ex;
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
}
调用示例如下:
1://如果参数包含ref关键字参数就传null即可
// object[] mArgs = new object[2];
string[] mArgs = new string[2];
mArgs[0] =“aaaa”;
mArgs[1] = null;
string WSURL="http://10.10.11.xxx/webservice.asmx";
object mReturn =Class1.InvokeWebservice(WSURL, "WebService1",null, "record_return", mArgs); //动态调用record_return方法。
string ss = mArgs[1].ToString();
Response.Write(ss);
//有ref关键字参数的record_return方法
public void record_return(string patientid, ref string htmlstring) {
htmlstring =patientid;
}
2:传参数无ref关键字
// object[] mArgs = new object[2];
string[] mArgs = new string[2];
mArgs[0] =“aaaa”;
mArgs[1] = “bbb”;
string mReturn =(string)Class1.InvokeWebservice(WSURL, "WebService1",null, "record_return", mArgs);//动态调用record_return方法(返回值为string类型)。
Response.Write(mReturn);
//无ref关键字参数的record_return方法
public void record_return(string patientid, string htmlstring) {
htmlstring =patientid;
}
参考地址:http://blog.csdn.net/cnming/article/details/2632820