随笔 - 303  文章 - 0  评论 - 11  阅读 - 15万

动态使用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>        }

 

posted on   雪原日暮  阅读(731)  评论(2编辑  收藏  举报
编辑推荐:
· 基于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
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示