您的位置:首页 > 其它

动态调用webservice方案

2010-12-28 09:36 323 查看

动态调用WebService

方案一:

优点:可以根据需求灵活调用Java或者.Net WebService;客户端调用WebService方法简单
缺点:每次我都要把想调用的函数的参数组织成一个object[]才行,且每次调用InvokeWebService都是在内存中创建动态程序集(代理),效率低。
调用WebService方法
InvokeWebService
/// <summary>
/// 获取WebService类型 20101223
/// </summary>
/// <param name="wsUrl">WebService地址</param>
/// <returns></returns>
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');

return pps[0];
}

/// <summary>
/// 调用WebService 20101223
/// </summary>
/// <param name="wsUrl">WebService地址</param>
/// <param name="methodName">方法名称</param>
/// <param name="args">参数列表</param>
/// <returns></returns>
public static string InvokeWebService(string wsUrl, string methodName, object[] args)
{
return InvokeWebService(wsUrl, null, methodName, args);
}

/// <summary>
/// 调用WebService 20101223
/// </summary>
/// <param name="wsUrl">WebService地址</param>
/// <param name="className">类名</param>
/// <param name="methodName">方法名称</param>
/// <param name="args">参数列表</param>
/// <returns></returns>
public static string InvokeWebService(string wsUrl, string className, string methodName, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((className == null) || (className == ""))
{
className = GetWsClassName(wsUrl);
}

try
{
//获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(wsUrl + "?wsdl");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
//System.Web.Services.Description.serviced
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);

//生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();

//设定编译参数
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");

//编译代理类
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.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).ToString();
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
客户端调用WebService方法
客户端调用WisTable4.queryCommon方法
ArrayList parms = new ArrayList();
string reslut = "";
parms.Add(queryArea);
parms.Add(SQL_sbsjBegin);
parms.Add(SQL_sbsjEnd);
parms.Add(SQL_pageIndex);
parms.Add(this.radioButton1.Checked);
parms.Add(queryType);
parms.Add(sqlstr);
reslut=WIS_PUB_Class.Security.InvokeWebService(Const.getWebServiceConnetion("WisTable4"),
"queryCommon", parms.ToArray());
DataSet rs = new DataSet();
rs = Tl.CXmlToDataSet(Security.Decrypt(reslut));//
//1.解压缩解密 2. XML转换成DataSet

方案二:

优点:不需要每一个方法生成代理类,提高调用webservice效率。
缺点:(无法使用该方法)因为每一个类需要创建一个DLL文件,添加DLL引用,但是添加Java和.Net DLL引用别名不一样。
创建DLL文件
CreateWebServiceDLL
public static void CreateWebServiceDLL(string url)
{
string @namespace = "ServiceBase.WebService.DynamicWebLoad";
string classname = WebServiceHelper.GetClassName(url);

WebClient web = new WebClient();
Stream stream = web.OpenRead(url + "?WSDL");
ServiceDescription description = ServiceDescription.Read(stream);
// 3. 创建客户端代理类
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "Soap";
importer.Style = ServiceDescriptionImportStyle.Client; //
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
importer.AddServiceDescription(description, null, null); //
CodeNamespace nmspace = new CodeNamespace(@namespace); //
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace);
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable = false;
parameter.OutputAssembly = "e://Wistable4.dll"; parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll");
CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
if (result.Errors.HasErrors)
{
System.Text.StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in result.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
}
调用WebService方法
CreateWebServiceDLL
public static object GetWebServiceInstance(string url)
{
string @namespace = "ServiceBase.WebService.DynamicWebLoad";
string classname = WebServiceHelper.GetClassName(url);
WebClient web = new WebClient();
Stream stream = web.OpenRead(url + "?WSDL");
ServiceDescription description = ServiceDescription.Read(stream);
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "Soap";
importer.Style = ServiceDescriptionImportStyle.Client;
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
importer.AddServiceDescription(description, null, null);
CodeNamespace nmspace = new CodeNamespace(@namespace);
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace);
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable = false;
parameter.OutputAssembly = "e://Wistable4.dll"; // parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll");
CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
if (result.Errors.HasErrors)
{
System.Text.StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in result.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("Wistable4");//Load("e://WisTable1");
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t);
return obj;
}
private static string GetClassName(string url)
{
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}

客户端 调用WebService方法
CreateWebServiceDLL
//声明全局的变量
public static ServiceBase.WebService.DynamicWebLoad.WISTABLE4_WS wistable4;//.NET 变量
//public static ServiceBase.WebService.DynamicWebLoad.Wistable4 wistable4;//.Java 变量
//声明变量Java和.net不一致,所以导致无法使用该方法。

object o = WebServiceHelper.GetWebServiceInstance(Const. getWebServiceConnetion(“Wistable4”));/
//获取服务器连接
wistable4 = o as ServiceBase.WebService.DynamicWebLoad.WISTABLE4_WS;
string dt = wistable4.queryByInfoID("1234567");//传入参数并且调用方法返回值
Console.WriteLine(dt);
Console.ReadLine();

方案三:

优点:通过HttpWebRequest 请求获取WSDL文件。不需要每一个方法创建代理类
缺点:每一次都要去获取该方法的WSDL的XML文件,并且返回XML文件,再针对返回的XML文件解析。
private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""></soap:Envelope>");
AddDelaration(doc);
XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
XmlElement soapMethod = doc.CreateElement(MethodName);
soapMethod.SetAttribute("xmlns", XmlNs);
foreach (string k in Pars.Keys)
{
XmlElement soapPar = doc.CreateElement(k);
soapPar.InnerText = Pars[k].ToString();
soapMethod.AppendChild(soapPar);
}
soapBody.AppendChild(soapMethod);
doc.DocumentElement.AppendChild(soapBody);
return Encoding.UTF8.GetBytes(doc.OuterXml);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: