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 }