仅供参考(一些网上查的资料)
using Microsoft.CSharp;
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Configuration;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
namespace WebServiceTestApp
{
/// <summary>
/// WebServiceHelper help to call the outside project web serice.
/// </summary>
public class WebServiceHelper
{
public static int WebServiceUrlTimeOutValue = 0; //默认为0
public static string WebServiceUrl;
/// <summary>
/// webservice 中需要调用的方法
/// </summary>
static MethodInfo webServiceMethodInfo;
/// <summary>
/// web service 对象
/// </summary>
static object objWebServiceCall;
static WebServiceHelper()
{
if (ConfigurationManager.AppSettings["webServer"] != null)
{
WebServiceUrl = ConfigurationManager.AppSettings["webServer"].ToString();
}
if (ConfigurationManager.AppSettings["webServerTimeOut"] != null)
{
int.TryParse(
ConfigurationManager.AppSettings["webServerTimeOut"].ToString(),
out WebServiceUrlTimeOutValue);
}
}
#region web service 基础类动态加载方法
public static object InvokeWebService(string methodname, object[] args)
{
if (string.IsNullOrEmpty(WebServiceUrl))
{
throw new ArgumentException("Config文件中缺少webServer的Url配置");
}
return InvokeWebService(WebServiceUrl, methodname, args);
}
public static void CreatWebServiceInvokeMethodeInfo(string url, string methodname, string classname = "")
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((classname == null) || (classname == ""))
{
classname = WebServiceHelper.GetWsClassName(url);
}
try
{
//get the WSDL 获取WSDL
WebClient wc = new WebClient();
//If the web service is <authentication mode="Windows" /> need add the credentials.
wc.Credentials = CredentialCache.DefaultCredentials;
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.ProtocolName = "Soap";
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);
//Generate the client proxy class code. 生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider icc = new CSharpCodeProvider();
//set the build parameter 设定编译参数
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");
//Proxy Class 编译代理类
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
StringBuilder sb = new StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//Generate the proxy object. and call the method
Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
//object obj = Activator.CreateInstance(t);
//MethodInfo mi = t.GetMethod(methodname);
objWebServiceCall = Activator.CreateInstance(t);
webServiceMethodInfo = t.GetMethod(methodname);
//If the web service is <authentication mode="Woindows" />
//Need add the below 3 line code. "SoapHttpClientProtocol"
//WebRequest.Credentials
SoapHttpClientProtocol webRequest = (SoapHttpClientProtocol)objWebServiceCall;
webRequest.PreAuthenticate = true;
if (WebServiceUrlTimeOutValue > 0)
webRequest.Timeout = WebServiceUrlTimeOutValue;
webRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
}
catch (Exception ex)
{
throw ex;
}
}
public static object InvokeWebService(string url, string methodname, object[] args)
{
object resultObj;
if (webServiceMethodInfo != null && objWebServiceCall != null
&& webServiceMethodInfo.Name.Equals(methodname))
{
resultObj = webServiceMethodInfo.Invoke(objWebServiceCall, args);
}
else
{
resultObj = InvokeWebService(url, null, methodname, args);
}
return resultObj;
}
private static object InvokeWebService(string url, string classname, string methodname, object[] args)
{
try
{
//创建调用web service 的方法对象
CreatWebServiceInvokeMethodeInfo(url, methodname, classname);
return webServiceMethodInfo.Invoke(objWebServiceCall, args);
}
catch (Exception ex)
{
throw new Exception(string.Format("无法和Web服务正常通信! [{0}]", ex.Message));
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
#endregion
}
}