zoukankan      html  css  js  c++  java
  • 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);  
     
    Powered By D&J (URL:http://www.cnblogs.com/Areas/)
  • 相关阅读:
    HI3518+RTSP(转)
    Linux常用命令英文全称与中文解释(转)
    旋转编码器正反转检测
    shell文件操作大全(转)
    makefile文件操作大全(转)
    Linux文件操作高频使用命令(转)
    浅谈linux中的根文件系统(转)
    分压电阻采样问题(转)
    python实现邮件发送
    50个很棒的Python模块
  • 原文地址:https://www.cnblogs.com/Areas/p/2186598.html
Copyright © 2011-2022 走看看