動態調用web服務,該方法只針對Web service, WCF的服務不行,若是是WCF的就經過工具直接生產代理類,把代理類配置到調用的項目中,經過配置客戶端的終結點動態的取實現:web
經過Svcutil.exe 工具生成代理類調用app
1.找到以下地址「C:\Windows\System32\cmd.exe」 命令行工具,右鍵以管理員身份運行(視系統是否爲win7 而定) ide
2.輸入以下命令:"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe" /out:C:\WCFClint\ClientCode.cs /config:C:\WCFClint\app.config http://localhost:81/WCFServiceTest/CNPatentSearchService.svc工具
說明:ui
參數1: 「C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe」 ,是指 SvcUtil.exe 工具的地址url
參數2: 「C:\WCFClint\ClientCode.cs 」 ,是指生成的代理類輸出存放到的地址spa
參數3: 「C:\WCFClint\app.config 」 ,是指存放到調用WCF服務程序目錄下的配置文件的輸出存放地址命令行
參數4: 「http://localhost:81/WCFServiceTest/CNPatentSearchService.svc」 ,是指部署到IIS 的WCF服務的地址代理
/// <summary>
/// 動態調用webservice
/// </summary>
public static class WebServiceHelper
{
public static object InvokeWebService(string url, string methodname, params object[] args)
{
return InvokeWebService(url, null, methodname, args);
}
public static object InvokeWebService(string url, string classname, string methodname, params object[] args)
{
string @namespace = "ServiceBase.WebService.DynamicWebLoad";
if (string.IsNullOrEmpty(classname))
{
classname = WebServiceHelper.GetClassName(url);
}
//獲取服務描述語言(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);
//CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
CodeDomProvider provider = new CSharpCodeProvider();
//設定編譯器的參數
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 = provider.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString() + System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
// 生成代理實例並調用方法
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);
}
private static string GetClassName(string url)
{
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
}ip