Silverlight动态调用WEBSERVICE,WCF方法

此方法只要知道SERVICE地址与要执行的方法名与参数即可调用webservice,
注意这个只是在普通工程中才可用。silverlight调用方法请往后看:
 
折叠C# 代码
  1. /// <summary>  
  2.         /// 动态调用WebService  
  3.         /// </summary>  
  4.         /// <param name="url">WebService地址</param>  
  5.         /// <param name="classname">类名</param>  
  6.         /// <param name="methodname">方法名(模块名)</param>  
  7.         /// <param name="args">参数列表</param>  
  8.         /// <returns>object</returns>  
  9.         public static object InvokeWebService(string url, string classname, string methodname, object[] args)  
  10.         {  
  11.             object obj = GetWebServiceClassObject(url,classname);  
  12.             Type t = obj.GetType();  
  13.             System.Reflection.MethodInfo mi = t.GetMethod(methodname);//通过反射获得方法名  
  14.             return mi.Invoke(obj, args);//使用制定的参数调用当前实例所表示的方法,执行方法  
  15.         }  
  16.         /// <summary>  
  17.         /// 获取webService远程对象  
  18.         /// </summary>  
  19.         /// <param name="url"></param>  
  20.         /// <param name="classname"></param>  
  21.         /// <returns></returns>  
  22.         public static object GetWebServiceClassObject(string url, string classname)  
  23.         {  
  24.             string @namespace = "ServiceBase.WebService.DynamicWebLoad";  
  25.             if (classname == null || classname == "")  
  26.             {  
  27.                 classname = GetClassName(url);  
  28.             }  
  29.             ///动态调用类所执行的过程  
  30.             //1.获取服务描述语言(WSDL)  
  31.             WebClient wc = new WebClient();  
  32.             Stream stream = wc.OpenRead(url + "?WSDL");  
  33.             ServiceDescription sd = ServiceDescription.Read(stream);//设置Web服务描述语言  
  34.             ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//生成客户端代理类  
  35.             sdi.AddServiceDescription(sd, """");  
  36.             CodeNamespace cn = new CodeNamespace(@namespace);//声明命名空间  
  37.             //2.生成客户端代理类代码  
  38.             CodeCompileUnit ccu = new CodeCompileUnit();//为CodeDOM程序图形提供容器  
  39.             ccu.Namespaces.Add(cn);//获取命名空间集合  
  40.             sdi.Import(cn, ccu);  
  41.             CSharpCodeProvider csc = new CSharpCodeProvider();//提供对 C# 代码生成器和代码编译器的实例的访问  
  42.             //ICodeCompiler icc = csc.CreateCompiler();//定义用于调用源代码编译的接口或使用指定编译器的 CodeDOM 树  
  43.             //3.设定编译器的参数  
  44.             CompilerParameters cplist = new CompilerParameters();  
  45.             cplist.GenerateExecutable = false;//设置是否为可执行文件  
  46.             cplist.GenerateInMemory = true;//设置是否在内存中生成输出  
  47.             cplist.ReferencedAssemblies.Add("System.dll");  
  48.             cplist.ReferencedAssemblies.Add("System.XML.dll");  
  49.             cplist.ReferencedAssemblies.Add("System.Web.Services.dll");  
  50.             cplist.ReferencedAssemblies.Add("System.Data.dll");  
  51.             //4.编译代理类  
  52.             CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu);// icc.CompileAssemblyFromDom(cplist, ccu);//使用指定的编译器设置编译程序集  
  53.             if (true == cr.Errors.HasErrors)  
  54.             {  
  55.                 System.Text.StringBuilder sb = new StringBuilder();  
  56.                 foreach (CompilerError ce in cr.Errors)  
  57.                 {  
  58.                     sb.Append(ce.ToString());  
  59.                     sb.Append(System.Environment.NewLine);  
  60.                 }  
  61.                 throw new Exception(sb.ToString());  
  62.             }  
  63.   
  64.             //5.生成代理实例,并调用方法  
  65.             System.Reflection.Assembly assembly = cr.CompiledAssembly;//获取或设置已编译的程序集  
  66.             Type t = assembly.GetType(@namespace + "." + classname, truetrue);  
  67.             object obj = Activator.CreateInstance(t);//为 COM 对象提供对方法的版本无关的访问  
  68.             return obj;  
  69.         }  
  70.         private static string GetClassName(string url)  
  71.         {  
  72.             string[] parts = url.Split('/');  
  73.             string[] pps = parts[parts.Length - 1].Split('.');  
  74.             return pps[0];  
  75.         }  
 
下面来看一下动态调用WCF服务:
 
这是我在一个项目中,为了不去配置服务地址,直接解析当前访问路径,加上服务的后面部分生成与SILVERLIGHT同一域名下的服务:
这个方法的前提是要先引用这个服务,这是silverlight下用的,普通程序中也差不多
折叠C# 代码
  1. /// <summary>  
  2.         /// 获取配置远程WCF服务对象  
  3.         /// </summary>  
  4.         public DMSTypeConfigWcfService.DMSTypeConfigServiceClient DmsTypeConfigWcfService  
  5.         {  
  6.             get  
  7.             {  
  8.                 if (_DmsTypeConfigWcfService == null)  
  9.                 {  
  10.                     string url = Application.Current.Host.Source.Scheme + "://" + Application.Current.Host.Source.DnsSafeHost + ":" +  
  11.                         Application.Current.Host.Source.Port + TypeConfigWcfUri;  //这里就是获得当前URL再加上服务路径,当然你也可以配置在一个地方。
  12.                     EndpointAddress address = new EndpointAddress(url);  
  13.   
  14.                     BinaryMessageEncodingBindingElement binary = new BinaryMessageEncodingBindingElement();  
  15.                     HttpTransportBindingElement transport = new HttpTransportBindingElement();  
  16.                     CustomBinding binding = new CustomBinding(binary, transport);  
  17.   
  18.                     _DmsTypeConfigWcfService = new DMSTypeConfigWcfService.DMSTypeConfigServiceClient(binding, address);  
  19.                 }  
  20.                 return _DmsTypeConfigWcfService;  
  21.             }  
  22.         }  
 silverlight下调用webservice与WCF类似。主要是把CustomBinding 改为Http的一个binding
代码如下:FenbiSl.WimUpFile.UpFileServiceSoapClient就是引用进来的WEBSERVICE服务对象
url 是与silverlight在同一域名下.所以我这样就可以做到更换域名或部署时不需要重新改配置...
 
折叠C# 代码
  1. string url = Application.Current.Host.Source.Scheme + "://" + Application.Current.Host.Source.DnsSafeHost + ":" +
  2.  Application.Current.Host.Source.Port + "/wim/UpFileService.asmx";  
  3.                EndpointAddress address = new EndpointAddress(url);  
  4.   
  5.                BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);  
  6.   
  7.                UpFileClient = new FenbiSl.WimUpFile.UpFileServiceSoapClient(binding, address);  
 
posted @ 2011-09-23 19:54  Areas  阅读(373)  评论(0编辑  收藏  举报