动态调用WebService 通用方法Moss 中 传统开发中都可用。

WebService是啥大家都知道了,这里不做过多的解释。通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会在我们的项目中生成一个WebService的动态连接库,就可以直接使用WebService中提供的各种方法了。

今天分享的是动态创建WebService。这里所谓的动态创建WebService到底是什么意思呢?就是不需要再项目中添加Web引用就可以使用你想调用的WebService中的方法了。

不过使用起来稍微有点复杂。后面我会给出调用的小实例。性能方面没做测试。希望大家能多提宝贵意见。

先贴代码: 一个动态创建动态连接库的方法。

#region 动态生成WebService程序集   CreateWSAssembly

        /// <summary>
        /// 动态生成WebService程序集
        /// </summary>
        /// <param name="DiyWsNameSpace">定义的WebService的命名空间</param>
        /// <param name="WebServiceSortUrl">除网站根目录后的WebServiceUrl</param>
        /// <param name="myNetWorkCredential">跨服务器时所使用的用户身份,如在编译环境下 设置为null即可</param>
        /// <returns>WebService程序集</returns>

        private System.Reflection.Assembly CreateWSAssembly(String DiyWsNameSpace, string WebServiceUrl, System.Net.NetworkCredential myNetWorkCredential)
        {
            #region 跟据WebServiec 生成客户端可用的代码
            System.Net.WebClient webClient = new System.Net.WebClient();

            if (myNetWorkCredential != null)
                webClient.Credentials = myNetWorkCredential;
            else
                webClient.Credentials = System.Net.CredentialCache.DefaultCredentials;

            System.IO.Stream stream = webClient.OpenRead(WebServiceUrl + "?WSDL");
            //用于创建或格式化WebService的服务描述语言的文档文件类
            System.Web.Services.Description.ServiceDescription serviceDescription = System.Web.Services.Description.ServiceDescription.Read(stream);
            //用户生成WebService 客户端代理类
            System.Web.Services.Description.ServiceDescriptionImporter serviceDescriptionImporter = new System.Web.Services.Description.ServiceDescriptionImporter();
            serviceDescriptionImporter.AddServiceDescription(serviceDescription, "", "");
            System.CodeDom.CodeNamespace coDeNamespace = new System.CodeDom.CodeNamespace(DiyWsNameSpace);
            System.CodeDom.CodeCompileUnit codeCompileUnit = new System.CodeDom.CodeCompileUnit();
            codeCompileUnit.Namespaces.Add(coDeNamespace);
            serviceDescriptionImporter.Import(coDeNamespace, codeCompileUnit);
            #endregion

            //对代码生成器和代码编译器的实例的访问的提供程序
            Microsoft.CSharp.CSharpCodeProvider CSharpProvider = new Microsoft.CSharp.CSharpCodeProvider();
            //获取C#代码编译器的实例
            System.CodeDom.Compiler.ICodeCompiler iCompiler = CSharpProvider.CreateCompiler();
            //调用实例所要用的参数
            System.CodeDom.Compiler.CompilerParameters cParams = new System.CodeDom.Compiler.CompilerParameters();
            //是否生成可执行文件
            cParams.GenerateExecutable = false;
            //是否在内存中生成输出
            cParams.GenerateInMemory = true;
            //要使用的程序集
            cParams.ReferencedAssemblies.Add("System.dll");
            cParams.ReferencedAssemblies.Add("System.XML.dll");
            cParams.ReferencedAssemblies.Add("System.Web.Services.dll");
            cParams.ReferencedAssemblies.Add("System.Data.dll");

            //从编译器返回的编译的结果类
            System.CodeDom.Compiler.CompilerResults cResults = iCompiler.CompileAssemblyFromDom(cParams, codeCompileUnit);

            //是否存在错误信息
            if (cResults.Errors.HasErrors)
            {
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                foreach (System.CodeDom.Compiler.CompilerError ce in cResults.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(System.Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }
            //获取程序集
            System.Reflection.Assembly assembly = cResults.CompiledAssembly;
            return assembly;

        }

        #endregion


调用事例:

            //跨域访问调用
            System.Reflection.Assembly SPSiteDataAssembly1 = this.CreateWSAssembly("自定义命名空间", "WebService地址", new System.Net.NetworkCredential("用户名","密码","域名"));
            //本地调用
            //System.Reflection.Assembly SPSiteDataAssembly = this.CreateWSAssembly("自定义命名空间", "WebService地址", null);
            //获得类型
            Type SiteDataType = SPSiteDataAssembly.GetType("自定义命名空间.类名", true, true);
            //实例对象
            Object SiteData = Activator.CreateInstance(SiteDataType);
            //获取方法信息
            System.Reflection.MethodInfo mi = SiteDataType.GetMethod("方法名");
            //方法中需要的参数
            Object[] parmas = new Object[] { };
            //调用方法返回结果
            object objresult = mi.Invoke(SiteData, parmas);

Moss 中传统开发中都可以用。

 

posted @ 2013-06-17 19:21  雷鸣_Sky  阅读(1005)  评论(0编辑  收藏  举报