在本节课程中,将演示如何通过程序动态添加、调用、编译、执行WebService并返回结果。

WebService动态调用示意图

WebService相关知识
代码文档对象模型CodeDom的使用
编程使用C#编译器
反射

1.先建动态调用辅助类 WebServiceHelper.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Configuration;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Net;
using System.Web.Services;
using System.Web.Services.Description;
using Microsoft.CSharp; namespace InvokeWebService
{
public static class WebServiceHelper
{
/// <summary>
/// 动态调用WebService
/// </summary>
/// <param name="Url">WebService地址</param>
/// <param name="methodname">WebService方法名(模块名)</param>
/// <param name="args">调用接口的参数列表</param>
/// <returns></returns>
public static object InvokeWebService(string Url,string methodname,object[] args)
{
return InvokeWebService(Url, null, methodname, args);
} /// <summary>
/// 动态调用WebService
/// </summary>
/// <param name="Url">WebService地址</param>
/// <param name="className">类名</param>
/// <param name="methodname">WebService方法名</param>
/// <param name="args">调用接口的参数列表</param>
/// <returns></returns>
public static object InvokeWebService(string Url, string className, string methodname, object[] args)
{
string @namespace = "ServiceBase.WebSerice.DynamicWebLoad";
if (className == null || className == "")
{
className = WebServiceHelper.GetClassName(Url);
}
//1.服务描述语言(WSDL)
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(Url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace); //2.生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();
//3.设定编译器的参数
CompilerParameters cplist = new CompilerParameters();
cplist.GenerateExecutable=false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
//4.变异代理类
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true==cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//生成代理实例,并调用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + className, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj, args);
} //获取类名
private static string GetClassName(string url)
{
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - ].Split('.');
return pps[];
}
}
}

WebServiceHelper.cs

2.建WebService,  Service1.asmx

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services; namespace InvokeServices
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{ [WebMethod]
public string HelloWorld(string Temp1,string Temp2)
{
return string.Format("参数1:{0},参数2:{1}", Temp1, Temp2);
}
}
}

Service1.asmx

3.建应用程序

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
string url = "http://localhost:4547/Service1.asmx";
string[] args = new string[];
args[] = this.textBox1.Text;
args[] = this.textBox2.Text;
object result = InvokeWebService.WebServiceHelper.InvokeWebService(url, "HelloWorld", args); this.textBox3.Text = result.ToString();
}
}
}

Form1.cs

WebService – 2.动态调用WebService的更多相关文章

  1. Java动态调用webService,axis2动态调用webService

    Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...

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

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

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

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

  4. 动态调用webservice(部分转载)

    动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...

  5. C# 动态调用webservice

    最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用): using ...

  6. 动态调用webservice及WCF服务

    动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...

  7. C# .NET 动态调用webservice的三种方式

    转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...

  8. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  9. 动态调用Webservice 支持Soapheader身份验证(转)

    封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...

随机推荐

  1. leetcode 74. Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  2. 用 ROS 做内网DNS服务器

    转载:http://iliuyong.iteye.com/blog/1035692 用 ROS 做内网DNS服务器方法:1.ROS 设置IP ->DNS 选择"static" ...

  3. WebApp的前端所遇问题

    2015年10月1日至10月25日,两个本科生和一位研究生以及一位老师组成四人团队,开发某教育前端项目 所遇问题总结以及分享: 一.主要应用软件:sublime_text HBuilder 初学者可以 ...

  4. NDK学习三: 纯手工编译Hello World

      1.配置环境变量 添加make工具path环境变量: E:\Android\android-ndk-r10b\prebuilt\windows-x86_64\bin     2.编写Hello W ...

  5. htpasswd命令

    htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名.域和用户基本认证的密码文件. 语法 htpasswd(选项)(参数) 选项 -c:创建一个加密文件:-n:不更新加密 ...

  6. Git是如何存储对象的

    原文:http://gitbook.liuhui998.com/7_1.html 一.前言 所有的对象都以SHA值为索引用gzip格式压缩存储, 每个对象都包含了对象类型, 大小和内容. Git中存在 ...

  7. SQL merge into 表合并

    Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源 ...

  8. C++ 代码头注释模板

    /********************************************************************************* *Copyright(C),You ...

  9. Wijmo 5 与Breeze 的组合,及与METRONIC 的集成

    1.Wijmo 5  是支持ANGULARJS 的HTML5 控件   http://wijmo.gcpowertools.com.cn/ 官方试用版  C1Wijmo-Eval_5.20151.42 ...

  10. unity3d项目文件目录发布后,对应的ios/android应用目录[转]

    Unity3d的Resource.AssetBundle与手游动态更新的报告,在这里分享一下,希望能够对各位用Unity的朋友有些许帮助.目录:1.Unity的资源数据加载2.Resource.Str ...