方法一:
需要WebService接口的内容。
一、开发环境下的WebService接口调用
1、需要从接口站点访问WebService文件
2、点击“服务说明”,将内容存成xml文件
3、将存出来的文件后缀名改成“wsdl”
4、在需要调用接口的项目--Service References中,添加服务引用
5、添加完服务引用,就可以正常调用啦
开发环境下的调用就完成了。
二、iis部署
1、在添加服务引用时,会在相应的项目config文件中生成相应的节点,记得要添加的iis服务对应的文件中去。
2、需要注意的事,最外层的web.config也需要添加相应的节点。
方法二:
当我们只知道接口地址,且在开发环境中无法访问以及获取接口内容时,可以用第二种方式。第二种方式修改修改的配置文件会少很多,方便部署。
一、实现调用接口(固定的,不需要变动)
#region InvokeWebService
/// <summary>
/// 动态调用WebService
/// </summary>
/// <param name="url">WebService地址</param>
/// <param name="classname">类名</param>
/// <param name="methodname">方法名(模块名)</param>
/// <param name="args">参数列表</param>
/// <returns>object</returns>
public static object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "ServiceBase.WebService.DynamicWebLoad";
if (classname == null || classname == "")
{
classname = WebServiceHelper.GetClassName(url);
}
//获取服务描述语言(WSDL)
WebClient wc = new WebClient();
LogHelper.Info("InvokeWebService:打开链接:" + url);
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);
//生成客户端代理类代码
LogHelper.Info("InvokeWebService:生成客户端代理类代码 ");
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();
//设定编译器的参数
LogHelper.Info("InvokeWebService:设定编译器的参数 ");
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");
//编译代理类
LogHelper.Info("InvokeWebService:编译代理类 ");
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
LogHelper.Info("Exception>>" + sb.ToString());
}
//生成代理实例,并调用方法
LogHelper.Info("InvokeWebService:生成代理实例,并调用方法>>" + cr.CompiledAssembly);
System.Reflection.Assembly assembly = cr.CompiledAssembly;
LogHelper.Info("InvokeWebService:生成代理实例,并调用方法>>" + @namespace + "." + classname + ">>" + assembly);
Type t = assembly.GetType(@namespace + "." + classname, true, true);
LogHelper.Info("InvokeWebService:生成代理实例,并调用方法>>执行CreateInstance:" + t);
object obj = Activator.CreateInstance(t);
LogHelper.Info(obj.ToString());
LogHelper.Info("InvokeWebService:生成代理实例,并调用方法>>执行CetMethod>>methodname" + methodname);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
LogHelper.Info("InvokeWebService:生成代理实例,并调用方法>>执行Invoke");
object objmi = null;
try
{
if (mi == null)
{
LogHelper.Info("为空");
}
objmi = mi.Invoke(obj, args);
}
catch (Exception ex)
{
LogHelper.Info("InvokeWebService>>Exception:" + ex);
}
return objmi;
}
private static string GetClassName(string url)
{
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
#endregion
二、调用
string url = "http://XXXXXX/AAA/WebService.asmx";/
string hisXML = WebServiceHelper.InvokeWebService(url, null, "InsertPatient", new object[] { 参数1,参数2,参数3 }) as string;