动态调用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 中传统开发中都可以用。
动态调用WebService 通用方法Moss 中 传统开发中都可用。的更多相关文章
- C# 动态调用 WebService (转)
在 Visual Studio 中客户端程序可以添加服务引用来调用 WebService,这样 Visual Studio 会生成与之相关的代理类,通过这个代理类可以很方便的访问所需要的服务. 如果服 ...
- 动态调用WebService接口的几种方式
一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...
- .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox
一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...
- ASP.NET中WebService的创建和部署以及通过反射动态调用WebService
一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加 这 ...
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- C# 通过Get、Post、Soap调用WebService的方法
实现代码来源于网络,我只是作了一些修改! using System; using System.Web; using System.Xml; using System.Collections; usi ...
- [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现
本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...
- Atitit 动态调用webservice与客户端代理方式调用
Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke 直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...
- 动态调用WebService(C#) (非常实用)
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
随机推荐
- CSRF注入式攻击防御讲解
0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...
- smarty foreach 最全用法
<?php$search_condition = "where name like '$foo%' ";$sql = 'select contact_id, name, ni ...
- "reactive programming"的概念
下面的内容大多是翻译来的. Reactive Programming? What is Reactive Programming? 为了了解Reactive——从编程范式至其背后的动机,有必要了解现在 ...
- linux压缩文件(夹) zip uzip命令的用法
压缩文件(夹) # 压缩列举的文件,格式如下: zip 压缩包名称 文件1 文件2 文件3 ... # 压缩test.txt, a.out文件,并取名为abc.zip $ zip abc.zip te ...
- easyui源码翻译1.32+API翻译全篇导航 (提供下载源码)
前言 EasyUI每个组件都会有 属性.方法.事件 属性 所有的属性都定义在jQuery.fn.{plugin}.defaults里面.例如,对话框属性定义在jQuery.fn.dialog.defa ...
- 【mysql的编程专题⑥】视图
视图是表的一个映射,是一张虚表,在结构上视图和普通的表没什么区别,一样可以用sql语句来增删改查; 视图创建后是一直存在数据库内 操作 创建视图 语法 CREATE [ALGORITHM]={UNDE ...
- Eclipse字体修改设置
修改字体 Window -> Preferences -> General -> Appearences -> Colors and Fonts 选择java选项,看到Java ...
- Autodesk 2015全套密钥
Below is a list for collecting all the Autodesk 2015 Product Keys: [*]AutoCAD 2015 001G1 [ ...
- win7下VS.NET中通过LinqToSQL连接oracle数据库
.NetFramework3.5提供了LinqToSQL组件,为我们访问数据库提供了方便.我用的是VS+Oracle开发工具.也想体验一下快捷方便的感觉. 1.连接Oracle数据库 在连接Oracl ...
- POJ1159——Palindrome(最长公共子序列+滚动数组)
Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from ...