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 中 传统开发中都可用。的更多相关文章

  1. C# 动态调用 WebService (转)

    在 Visual Studio 中客户端程序可以添加服务引用来调用 WebService,这样 Visual Studio 会生成与之相关的代理类,通过这个代理类可以很方便的访问所需要的服务. 如果服 ...

  2. 动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

  3. .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox

    一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...

  4. ASP.NET中WebService的创建和部署以及通过反射动态调用WebService

    一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加 这 ...

  5. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...

  6. C# 通过Get、Post、Soap调用WebService的方法

    实现代码来源于网络,我只是作了一些修改! using System; using System.Web; using System.Xml; using System.Collections; usi ...

  7. [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

    本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...

  8. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

  9. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

随机推荐

  1. APP 上传之后出现"invalid binary" 问题解决汇总

    背景 5.1 号开始 App 审核开始强制支持 iPhone5,并禁止使用 UDID. 问题 上传 app 后一直处于 Invalid Binary 状态,并且收到一封邮件说 Non-public A ...

  2. 写给 iOS 开发者的 Hopper + lldb 简介

    最近,关于 @Steipete 在Radar发布的帖子,笔者看到很多人在问「你是怎么理解那个伪代码的」.笔者想写博客已经有一段时间了,现在正好就此发表第一篇博文.笔者在一个叫 Hopper 的工具上花 ...

  3. socket选项自带的TCP异常断开检测

    TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况. 在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应 ...

  4. Servlet课程0426(十)Servlet如何删除cookie

    //如何删除Cookie案例 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class Coo ...

  5. 意外发现,VC断点可加在构造函数的左括号上

    CTestApp::CTestApp() { // 断点加在这里,然后可单步进入CTestApp的父类CWinApp的构造函数进行调试! ; } 并且在CWinApp的构造函数的左括号上,可进一步进入 ...

  6. 哈希值识别工具hash-identifier

    Hash Identifier可以用来识别各种类型的哈希值.在kali上使用方法很简单 (1)搜索hash-identifier (2)在HASH后面输入要识别的hash内容 (3)识别成功 wind ...

  7. Azure HDInsight HBase DR解决方案

    Sun wei  Sat, Feb 28 2015 3:07 AM Apache HBase是目前非常流行的NoSQL数据库,通过HDFS+Zookeep+Master+Region Server的架 ...

  8. Spring编程风格

    给自己使用的无需定义接口:即一个模块内部的都是封装的,定义接口并不会得到很多好处,变过几次实现?? “优先面向接口编程,而非实现” 不是必须,是优先: 给朋友(第三方)使用的定义接口:即要公开的功能, ...

  9. 深入理解Arrays.sort()

    两种方法: 1.类本来就实现java.lang.Comparable接口,使类本身就有比较能力.接口实现compareTo方法,次方法接收另一个Object为参数,如果当前对象小于参数则返回负值,如果 ...

  10. ORACLE SQLloader详细语法

    Oracle   SQL   Loader的详细语法     SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中.SQL*LOADER是大型数据     ...