您好,登錄后才能下訂單哦!
在C#中如何實現動態調用WebService?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
WebServiceHelper代碼:
using Microsoft.CSharp; using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Web.Services.Description; using System.Xml.Serialization; namespace SunCreate.HaiKang8600WebService.Utils { /// <summary> /// 動態調用WebService /// </summary> public static class WebServiceHelper { /// <summary> /// 動態調用WebService /// </summary> /// <param name="url">WebService地址</param> /// <param name="strNamespace">命名空間</param> /// <param name="className">類名</param> /// <param name="methodName">方法名(模塊名)</param> /// <param name="args">參數列表</param> public static object InvokeWebService(string url, string strNamespace, string className, string methodName, object[] args) { try { WebClient webClient = new WebClient(); Stream stream = webClient.OpenRead(url); //獲取服務描述語言(WSDL) ServiceDescription serviceDescription = ServiceDescription.Read(stream); //通過直接從 Stream實例加載 XML 來初始化ServiceDescription類的實例。 ServiceDescriptionImporter serviceDescriptionImporter = new ServiceDescriptionImporter(); serviceDescriptionImporter.AddServiceDescription(serviceDescription, null, null); //生成客戶端代理類代碼 CodeNamespace codeNamespace = new CodeNamespace(strNamespace); //CodeNamespace表示命名空間聲明。 CodeCompileUnit codeCompileUnit = new CodeCompileUnit(); codeCompileUnit.Namespaces.Add(codeNamespace); serviceDescriptionImporter.Import(codeNamespace, codeCompileUnit); CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider(); ICodeCompiler iCodeCompiler = csharpCodeProvider.CreateCompiler();//取得C#程式碼編譯器的執行個體 //設定編譯器的參數 CompilerParameters compilerParameters = new CompilerParameters();//創建編譯器的參數實例 compilerParameters.GenerateExecutable = false; compilerParameters.GenerateInMemory = true; compilerParameters.ReferencedAssemblies.Add("System.dll"); compilerParameters.ReferencedAssemblies.Add("System.XML.dll"); compilerParameters.ReferencedAssemblies.Add("System.Web.Services.dll"); compilerParameters.ReferencedAssemblies.Add("System.Data.dll"); //編譯代理類 CompilerResults compilerResults = iCodeCompiler.CompileAssemblyFromDom(compilerParameters, codeCompileUnit); if (true == compilerResults.Errors.HasErrors) { StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in compilerResults.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理實例,并調用方法 System.Reflection.Assembly assembly = compilerResults.CompiledAssembly; Type type = assembly.GetType(strNamespace + "." + className, true, true); object obj = Activator.CreateInstance(type); System.Reflection.MethodInfo methodInfo = type.GetMethod(methodName); //MethodInfo 的實例可以通過調用GetMethods或者Type對象或派生自Type的對象的GetMethod方法來獲取,還可以通過調用表示泛型方法定義的 MethodInfo 的MakeGenericMethod方法來獲取。 return methodInfo.Invoke(obj, args); } catch (Exception ex) { LogUtil.LogError(ex, "動態調用WebService 錯誤"); return null; } } } }
使用示例:
string url = "http://172.16.36.26:8080/attachment/services/AttachmentService?wsdl"; object[] args = new object[2]; args[0] = "1"; args[1] = "1"; object str = WebServiceHelper.InvokeWebService(url, "service.webservice", "AttachmentService", "checkGrade", args); string sstr = str.ToString();
看完上述內容,你們掌握在C#中如何實現動態調用WebService的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。