C# 动态生成WebService,无需添加引用

C#项目调用WebService是很常见的现象,但一旦修改链接地址就需要重新更新引用很是麻烦,这里跟大家分享一个通过地址,无需添加引用动态生成Webservice的小方法

方法类:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.ServiceModel;
  6 using System.ServiceModel.Channels;
  7 using System.Net;
  8 using System.Web.Services.Description;
  9 using System.CodeDom;
 10 using Microsoft.CSharp;
 11 using System.CodeDom.Compiler;
 12 using System.IO;
 13
 14 namespace AlarmPublish.Common
 15 {
 16     /// <summary>
 17     /// Webservice 帮助工具类
 18     /// </summary>
 19     public static class WebserviceHelper
 20     {
 21         /// <summary>
 22         /// 根据 Url 创建 webservice 实例
 23         /// </summary>
 24         /// <typeparam name="T"></typeparam>
 25         /// <param name="url"></param>
 26         /// <returns></returns>
 27         public static T CreateInstance<T>(string url)
 28         {
 29             if (url.EndsWith("svc"))
 30             {
 31                 return CreateWCF<T>(url);
 32             }
 33
 34             if (url.EndsWith("asmx"))
 35             {
 36                 return CreateAsmx<T>(url);
 37             }
 38
 39             return default(T);
 40         }
 41
 42         private static T CreateWCF<T>(string url)
 43         {
 44             BasicHttpBinding basicBinding = new BasicHttpBinding();
 45             CustomBinding binding = new CustomBinding(basicBinding);
 46             BindingElement binaryElement = new BinaryMessageEncodingBindingElement();
 47             binding.Elements.Remove(binding.Elements[0]);
 48             binding.Elements.Insert(0, binaryElement);
 49
 50             EndpointAddress endPoint = new EndpointAddress(url);
 51
 52             T client = (T)Activator.CreateInstance(typeof(T), binding, endPoint);
 53
 54             return client;
 55         }
 56
 57         private static T CreateAsmx<T>(string url)
 58         {
 59             BasicHttpBinding basicBinding = new BasicHttpBinding();
 60             basicBinding.MaxBufferSize = int.MaxValue;
 61             basicBinding.MaxReceivedMessageSize = int.MaxValue;
 62             basicBinding.ReceiveTimeout = TimeSpan.FromMinutes(10);
 63             basicBinding.OpenTimeout = TimeSpan.FromMinutes(1);
 64
 65             CustomBinding binding = new CustomBinding(basicBinding);
 66             EndpointAddress endPoint = new EndpointAddress(url);
 67
 68             T client = (T)Activator.CreateInstance(typeof(T), binding, endPoint);
 69
 70             return client;
 71         }
 72
 73         #region 动态调用WebService动态调用地址
 74         /// < summary>
 75         /// 动态调用web服务
 76         /// < /summary>
 77         /// < param name="url">WSDL服务地址< /param>
 78         /// < param name="methodname">方法名< /param>
 79         /// < param name="args">参数< /param>
 80         /// < returns>< /returns>
 81         public static object InvokeWebService(string url, string methodname, object[] args)
 82         {
 83             return WebserviceHelper.InvokeWebService(url, null, methodname, args);
 84         }
 85         /// <summary>
 86         /// 动态调用web服务
 87         /// </summary>
 88         /// <param name="url">WSDL服务地址</param>
 89         /// <param name="classname">服务接口类名</param>
 90         /// <param name="methodname">方法名</param>
 91         /// <param name="args">参数值</param>
 92         /// <returns></returns>
 93         public static object InvokeWebService(string url, string classname, string methodname, object[] args)
 94         {
 95
 96             string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
 97             if ((classname == null) || (classname == ""))
 98             {
 99                 classname = WebserviceHelper.GetWsClassName(url);
100             }
101             try
102             {
103
104                 //获取WSDL
105                 WebClient wc = new WebClient();
106                 Stream stream = wc.OpenRead(url + "?WSDL");
107                 ServiceDescription sd = ServiceDescription.Read(stream);
108                 //注意classname一定要赋值获取
109                 classname = sd.Services[0].Name;
110
111                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
112                 sdi.AddServiceDescription(sd, "", "");
113                 CodeNamespace cn = new CodeNamespace(@namespace);
114
115                 //生成客户端代理类代码
116                 CodeCompileUnit ccu = new CodeCompileUnit();
117                 ccu.Namespaces.Add(cn);
118                 sdi.Import(cn, ccu);
119                 CSharpCodeProvider icc = new CSharpCodeProvider();
120
121
122                 //设定编译参数
123                 CompilerParameters cplist = new CompilerParameters();
124                 cplist.GenerateExecutable = false;
125                 cplist.GenerateInMemory = true;
126                 cplist.ReferencedAssemblies.Add("System.dll");
127                 cplist.ReferencedAssemblies.Add("System.XML.dll");
128                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
129                 cplist.ReferencedAssemblies.Add("System.Data.dll");
130                 //编译代理类
131                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
132                 if (true == cr.Errors.HasErrors)
133                 {
134                     System.Text.StringBuilder sb = new System.Text.StringBuilder();
135                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
136                     {
137                         sb.Append(ce.ToString());
138                         sb.Append(System.Environment.NewLine);
139                     }
140                     throw new Exception(sb.ToString());
141                 }
142                 //生成代理实例,并调用方法
143                 System.Reflection.Assembly assembly = cr.CompiledAssembly;
144                 Type t = assembly.GetType(@namespace + "." + classname, true, true);
145                 object obj = Activator.CreateInstance(t);
146                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);
147                 return mi.Invoke(obj, args);
148
149             }
150             catch (Exception ex)
151             {
152                 throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
153                 // return "Error:WebService调用错误!" + ex.Message;
154             }
155         }
156         private static string GetWsClassName(string wsUrl)
157         {
158             string[] parts = wsUrl.Split(‘/‘);
159             string[] pps = parts[parts.Length - 1].Split(‘.‘);
160             return pps[0];
161         }
162         #endregion
163     }
164 }

方法调用:

 1  /// <summary>
 2         /// 调用操作
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void Operation()
 7         {
 8            #region 动态调用 webservices地址
 9             try
10             {
11
12                 object[] args = new object[2];
13                 args[0] = ("参数一");
14                 args[1] = ("参数二");
15
16                 object result = WebServiceHelper.InvokeWebService("http://10.135.10.110:8000/ServiceTest.asmx", "serviceMethod", args);
17                 string message = result.ToString();
18
19             }
20             catch { }
21             #endregion
22         }

时间: 2024-10-04 08:01:54

C# 动态生成WebService,无需添加引用的相关文章

原生js怎么为动态生成的标签添加各种事件

这几天用zepto.js写了不少事件,突然想到一个问题,那就是原生的js如何给动态生成的标签添加事件?因为这些标签都是后来通过ajax或者运行其他点击事件生成的,那么如果之前给他们写事件他们这个dom对象是找不到的,jq通过事件委托解决了这个问题,但是原生js这个问题该怎么解决呢?我在网上查了很多资料,好像只有一种办法,那就是在生成标签并把标签添加到html结构中后再添加对于这个新标签的各种事件,如果有更好的方法,欢迎提出来. <!DOCTYPE html> <html lang=&qu

jquery无法为动态生成的元素添加点击事件的解决方法

遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <div> <ul> <li> <span> <i class='icon'>这是元素内容</i> //i是动态生成 </span> </li> </ul> </div> 解决方法如下: $(docu

动态生成的html添加事件

一.问题描述 用jQuery的append()方法动态添加了一段html代码之后,发现在为新添加的元素绑定click事件时无法获取该新元素. 二.解决方法 度娘推荐的方法基本是用live()方法 live()的官方定义和用法: live() 方法为被选元素附加一个或多个事件处理程序,并规定当这些事件发生时运行的函数.通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素). live()的详细使用方法可以查看jQuery live() live()和

jQuery向动态生成的内容添加事件响应

jQuery live() 方法是给所有匹配的元素附加一个事件处理函数,即使这个元素是以后通过append,prepend,after等事件生成后的内容也依然有效. 这个方法可以看做是 .bind() 方法的一个变体.使用 .bind() 时,选择器匹配的元素会附加一个事件处理函数,而以后再添加的元素则不会有.为此需要再使用一次 .bind() 才行.比如说: 1 <body> <div class="clickme">Click here</div>

android动态生成界面、添加组件

效果图: layout界面布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:ad="http://schemas.android.com/apk/res/android" ad:layout_width="match_parent" ad:layout_height="match_parent" ad:orient

无需添加引用执行JS,发布无需带DLL、例子:QQMD5 QQGTK 13位时间戳 取随机数

javascriptDemo.rar 本人写POST经常会遇到用JS来加密的一些网站,然后又不想用C#重写.在百度和论坛里找的JS执行不是64位不支持就是要带个DLL神马的.很讨厌.然后自己就写了个不需要带DLL的.而且支持所有系统哟(64位也一样)(服务器2003多线程POST1个月没崩溃过) <ignore_js_op> 先来一个取13位时间戳的 相信玩POST的都比较常见 比如:1410106357535 [C#] 纯文本查看 复制代码             Type obj = Ty

java应用maven插件动态生成webservice代码

pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <

不添加引用,动态调用WebService

这两天给公司写一个调用接口的程序,接口采用WebService! 本打算将这个工具写成通用的,但是微软给出的调用WebService的方法必须添加该WebService引用,这样的方式不免太过于死板,无法动态调用,于是在网上查了很多相关解决办法!自己封装成了一个函数,发布出来,做个纪念! using System.Net; using System.IO; using System.Web.Services.Description; using System.CodeDom; using Sys

C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll C#调用、动态调用

1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图所示, 也可以在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url public new string Url { set; get; } 2.根据wsdl文件生成webservice 的.cs文件 及 生成dll C#调用   有时没有这么多文件