动态使用webservice,以及含有ref类型的参数的问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService( string url, string methodname, object [] args, Type[] arrytype) { return WSHelper.InvokeWebService(url + "/Services/ExcelAddIns.asmx" , null , methodname, args, arrytype); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService( string url, string classname, string methodname, object [] args, Type[] arrytype) { string @ namespace = "OGC_Addin.Class" ; if ((classname == null ) || (classname == "" )) { classname = WSHelper.GetWsClassName(url); } try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url + "?WSDL" ); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "" , "" ); CodeNamespace cn = new CodeNamespace(@ namespace ); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider icc = new CSharpCodeProvider(); //设定编译参数 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; if (arrytype.Length > 0) { mi = t.GetMethod(methodname, arrytype); } else { mi = t.GetMethod(methodname); } return mi.Invoke(obj, args); } catch (Exception ex) { throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace)); } } private static string GetWsClassName( string wsUrl) { string [] parts = wsUrl.Split( '/' ); string [] pps = parts[parts.Length - 1].Split( '.' ); return pps[0]; } }<br> //----------------------------------------------------------<br>//参数传递方式<br><br><br><br> public int ApproveTestReportByHHX(string SeverUrl, int testReportId, string UId, ref string msg)<br> {<br> int tem =0;<br><br> object[] para_arry = new object[3];<br> para_arry[0] = testReportId;<br> para_arry[1] = UId;<br> para_arry[2] = msg;<br><br> Type[] type_arry = new Type[] { <br> typeof(int),<br> typeof(string),<br> typeof(string).MakeByRefType()<br> };<br> tem =(bool) WSHelper.InvokeWebService(SeverUrl, "ApproveReportByHHX", para_arry, type_arry)?1:0;<br> //Ogcis_Server.ExcelAddInsSoapClient soap = new Ogcis_Server.ExcelAddInsSoapClient();<br> //tem = soap.ApproveReportByHHX(testReportId, UId, ref msg);<br> msg=para_arry[2].ToString();<br> return tem;<br> } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2014-09-26 动态拼接 sql的时候 里面 如果有变量的话 按上面的方式进行处理
2014-09-26 insert当 sql语句里面有变量 为字符类型的时候 要3个单引号
2014-09-26 如果 @s int 把它转成字符,可以这样 cast(@s as varchar)
2014-09-26 sql