private object InvokeWebService(string url, string methodname, object[] args)
{
return InvokeWebService(url, null, methodname, args);
}
private object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((classname == null) || (classname == ""))
{
classname = GetWsClassName(url);
}
try
{
// 1. 使用 WebClient 下载 WSDL 信息。
WebClient wClient = new WebClient();
// 设置代理服务器
bool useProxy = Convert.ToBoolean(ConfigurationManager.AppSettings["UseProxy"]);
if (useProxy)
{
WebProxy proxy = null;
string proxyAddressAndPort = ConfigurationManager.AppSettings["Proxy"];
string proxyUserName = ConfigurationManager.AppSettings["ProxyUserName"];
string proxyPassword = ConfigurationManager.AppSettings["ProxyPassword"];
ICredentials cred;
cred = new NetworkCredential(proxyUserName, proxyPassword);
proxy = new WebProxy(proxyAddressAndPort, true, null, cred);
WebRequest.DefaultWebProxy = proxy;
wClient.Proxy = proxy;
}
Stream stream = wClient.OpenRead(url + "?WSDL");
// 2. 创建和格式化 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); // 添加 WSDL 文档。
// 4. 使用 CodeDom 编译客户端代理类。
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.GenerateInMemory = true;
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 (true == result.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in result.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
// 5. 使用 Reflection 调用 WebService。
System.Reflection.Assembly assembly = result.CompiledAssembly; //经过编译了的程序集类
Type t = assembly.GetType(@namespace + "." + classname, true, true); //类类型
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname); //方法类型
System.Reflection.PropertyInfo pi = t.GetProperty("XXXHeaderValue"); //属性类型
System.Reflection.Assembly assembly1 = result.CompiledAssembly; //经过编译了的程序集类
Type t1 = assembly1.GetType(@namespace + "." + classname + "Header", true, true); //类类型
object obj1 = Activator.CreateInstance(t1);
System.Reflection.PropertyInfo piUsername = t1.GetProperty("Username"); //属性类型
System.Reflection.PropertyInfo piPassword = t1.GetProperty("Password"); //属性类型
piUsername.SetValue(obj1, "broze", null);
piPassword.SetValue(obj1, "jiba", null);
pi.SetValue(obj, obj1, null);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
动态调用Webservice
最新推荐文章于 2023-04-20 14:06:20 发布