C#动态调用Webservice
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#动态调⽤Webservice
通常我们在程序中需要调⽤WebService时,都是通过“添加Web引⽤”,让环境来为我们⽣成服务代理,然后调⽤对应的Web服务。
这样是使⼯作简单了,但是却和提供Web服务的URL、⽅法名、参数绑定在⼀起了,这是⾃动为我们⽣成Web服务代理的限制。
如果哪⼀天发布Web服务的URL改变了,则我们需要重新让⽣成代理,并重新编译。
在某些情况下,这可能是不能忍受的,我们需要动态调⽤WebService的能⼒。
⽐如我们可以把Web服务的URL保存在配置⽂件中,这样,当服务URL改变时,只需要修改配置⽂件就可以了
参考
动态调⽤WebService(C#)
public class WebServiceHelper
{
///<summary>
///动态调⽤web服务
///</summary>
///<param name="url">url ⽹址</param>
///<param name="methodname">⽅法名</param>
///<param name="args">参数</param>
///<returns></returns>
public static object InvokeWebServiceDynamic(string url, string methodname, object[] args)
{
return InvokeWebService(url, string.Empty, methodname, args);
}
public static object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((classname == null) || (classname == ""))
{
classname = WebServiceHelper.GetWsClassName(url);
}
try
{
InstanceInfo instance = GetInstanceInfo(@namespace, classname, methodname);
if (instance != null)
{
return instance.InstanceMethod.Invoke(instance.Instance, args);
}
//获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
wc.Dispose();
stream.Close();
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);
//⽣成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
spaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();
//ICodeCompiler icc = csc.CreateCompiler();
csc.Dispose();
//设定编译参数
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 = pileAssemblyFromDom(cplist, ccu);
CompilerResults cr = pileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (pilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//⽣成代理实例,并调⽤⽅法
System.Reflection.Assembly assembly = piledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
InstanceInfo newInstance = new InstanceInfo()
{
ClassName = classname,
MethodName = methodname,
NameSpace = @namespace,
InstanceType = t,
InstanceMethod = mi,
Instance = obj
};
_curInstanceInfo.Add(newInstance);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private static List<InstanceInfo> _curInstanceInfo = new List<InstanceInfo>();
private static InstanceInfo GetInstanceInfo(string nameSpace, string className, string methodName)
{
if (_curInstanceInfo.Exists(i => i.ClassName.Equals(className) && Space.Equals(nameSpace) && i.MethodName.Equals(methodName))) {
return
_curInstanceInfo.FirstOrDefault(
i =>
i.ClassName.Equals(className) && Space.Equals(nameSpace) &&
i.MethodName.Equals(methodName));
}
else
{
return null;
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
}
public class InstanceInfo
{
///<summary>
///命名空间
///</summary>
public string NameSpace { get; set; }
///<summary>
///类名
///</summary>
public string ClassName { get; set; }
///<summary>
///⽅法名
///</summary>
public string MethodName { get; set; }
///<summary>
///实例类型
///</summary>
public Type InstanceType { get; set; }
///<summary>
///需要调⽤的⽅法
///</summary>
public System.Reflection.MethodInfo InstanceMethod { get; set; }
public object Instance { get; set; }
}
调⽤
string url = "/globalweather.asmx" ;
string[] args = new string[2] ;
args[0] = this.textBox_CityName.Text ;
args[1] = "China" ;
object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;
bel_Result.Text = result.ToString() ;。