码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2017-09-18 17:28:55      阅读:475      评论:0      收藏:0      [点我收藏+]

标签:end   common   classname   append   time   reference   move   channel   name   

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 }
View Code

方法调用:
技术分享
 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         }
View Code

 

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

标签:end   common   classname   append   time   reference   move   channel   name   

原文地址:http://www.cnblogs.com/mengfangchao/p/7543660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!