首页 > 编程语言 >C#动态库调用webservice

C#动态库调用webservice

时间:2023-07-22 12:23:17浏览次数:54  
标签:调用 webservice cplist C# System classname new 类名 string

1.c#调用一外部webservice时,对方能收到数据包,缺收不到正确数据,报莫名错误。对方也不知道原因。

只能采用动态调用方式。

采用如下类:

  1  public class WebserviceHelper
  2     {
  3         /// <summary>
  4         /// 动态调用web服务
  5         /// </summary>
  6         /// <param name="url">web服务地址</param>
  7         /// <param name="classname">类名</param>
  8         /// <param name="methodname">方法名</param>
  9         /// <param name="args">参数数组</param>
 10         /// <returns>返回结果</returns>
 11         public static object InvokeWebService(string url, string namespaceName, string classname, string methodname, object[] args)
 12         {
 13             string @namespace = namespaceName;
 14             if (namespaceName == null)
 15             {
 16                 @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
 17             }
 18             if ((classname == null) || (classname == ""))
 19             {
 20                 classname = WebserviceHelper.GetWsClassName(url);
 21             }
 22             try
 23             {
 24                 //返回首次编译的对象
 25                 object instance = GetWebServiceInstance(url, namespaceName, classname, methodname, args);
 26                 System.Reflection.MethodInfo m = instance.GetType().GetMethod(methodname);
 27                 return m.Invoke(instance, args);
 28             }
 29             catch (Exception ex)
 30             {
 31                 throw ex;
 32             }
 33         }
 34 
 35         /// <summary>
 36         /// 一个WebService实例
 37         /// </summary>
 38         private static object ServiceInstance = null;
 39         private static object GetWebServiceInstance(string url, string namespaceName, string classname, string methodname, object[] args)
 40         {
 41             if (ServiceInstance != null) return ServiceInstance;
 42             string @namespace = namespaceName;
 43             if (namespaceName == null)
 44             {
 45                 @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
 46             }
 47             if ((classname == null) || (classname == ""))
 48             {
 49                 classname = WebserviceHelper.GetWsClassName(url);
 50             }
 51             try
 52             {
 53                 //获取WSDL
 54                 WebClient wc = new WebClient();
 55                 Stream stream = wc.OpenRead(url + "?WSDL");
 56                 ServiceDescription sd = ServiceDescription.Read(stream);
 57                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
 58                 sdi.AddServiceDescription(sd, "", "");
 59                 CodeNamespace cn = new CodeNamespace(@namespace);
 60 
 61                 //生成客户端代理类代码
 62                 CodeCompileUnit ccu = new CodeCompileUnit();
 63                 ccu.Namespaces.Add(cn);
 64                 sdi.Import(cn, ccu);
 65                 CSharpCodeProvider csc = new CSharpCodeProvider();
 66                 ICodeCompiler icc = csc.CreateCompiler();
 67 
 68                 //设定编译参数
 69                 CompilerParameters cplist = new CompilerParameters();
 70                 cplist.GenerateExecutable = false;
 71                 cplist.GenerateInMemory = true;
 72                 cplist.ReferencedAssemblies.Add("System.dll");
 73                 cplist.ReferencedAssemblies.Add("System.XML.dll");
 74                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
 75                 cplist.ReferencedAssemblies.Add("System.Data.dll");
 76                 //编译代理类
 77                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
 78                 if (true == cr.Errors.HasErrors)
 79                 {
 80                     System.Text.StringBuilder sb = new System.Text.StringBuilder();
 81                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
 82                     {
 83                         sb.Append(ce.ToString());
 84                         sb.Append(System.Environment.NewLine);
 85                     }
 86                     throw new Exception(sb.ToString());
 87                 }
 88                 //生成代理实例,并调用方法
 89                 System.Reflection.Assembly assembly = cr.CompiledAssembly;
 90                 Type t = assembly.GetType(@namespace + "." + classname, true, true);
 91                 ServiceInstance = Activator.CreateInstance(t);
 92                 return ServiceInstance;
 93             }
 94             catch (Exception ex)
 95             {
 96                 throw ex;
 97             }
 98         }
 99 
100         /// <summary>
101         /// 获取web服务类名
102         /// </summary>
103         /// <param name="wsUrl">web服务地址</param>
104         /// <returns>web服务类名</returns>
105         private static string GetWsClassName(string wsUrl)
106         {
107             string[] parts = wsUrl.Split('/');
108             string[] pps = parts[parts.Length - 1].Split('.');
109             return pps[0];
110         }
111     }
View Code

报错:

 原因分析:

1.“InvokeWebService”是个重载函数,如果webserver没有申明类名,就不传类名,代码就自动获取默认的类名,如果有申明类名,就必须要传,否则就找不到类。(来源网友)

2.如何获知类名:其实只要在vs里面导入web引用输入就可以看见类名。(实验有效)
还有一种方法就是通过代码动态获得类名。

参考:动态调用WebService 的问题~~ 不知道为什么-CSDN社区

标签:调用,webservice,cplist,C#,System,classname,new,类名,string
From: https://www.cnblogs.com/bgbing/p/17573148.html

相关文章

  • C# 实现抓取财经网站页面内容的实例方法
    ​ protectedvoidEnter_Click(objectsender,EventArgse)        {            WebClientwe=newWebClient();  //主要使用WebClient类            byte[]myDataBuffer;            myDataBuffer=we.DownloadData......
  • 验证码插件 vercode.js
    第1代图片验证码- 字母数字型 第2代滑动验证码-图片截取型第3代验证码-选图型 vercode.js结合了上面的情况下新研发的一种验证码。验证码类型验证码描述操作性安全性描述字母数字型图片验证码这是一种通过后台随机码生成图片的验证码。服务器会在......
  • git cherry-pick的使用
    gitcherry-pick<commitid>是用来将其他某个分支上的某次commit复制到当前分支假设你的项目提交历史如下:(箭头相当于一个指针,表示当前这个commit是基于指向的那个commit修改的,HEAD也是一个这样的指针)如果你希望将提交e43a6拉取到master分支,你可以执行:$gitcheckout......
  • python接口自动化项目部署在centos7上
    我选择在apache根目录下/var/www/html创建一个目录test 切换到test目录下 进入创建的目录,并初始化git,输入命令gitinit如果会报错InitializedemptyGitrepositoryin/var/www/html/test/.git/,就输入yum-yupdate用于更新系统中安装的软件包到最新可用版本。 再次输......
  • 虚拟机安装clion
    虚拟机安装clion软件在jetbrains官网下载,进入网址https://www.jetbrains.com/clion/download/#section=linux,选择linux版本,点击download进行下载。在window上面下载好了后,运行虚拟机vmwareworkstation,我虚拟机是16.1,虚拟机镜像文件是ubuntu18.04软件通过filezilla进行传输,也......
  • Mybatis练习CRUD
    namespacenamespcae中的包名要和mapper接口中的方法名一致-id:就是对应的namespace中的方法名-resultType:Sql语法执行的返回值-parameter:  参数类型1、select(选择、查询语句)1、编写接口List<User>getUserList();2、编写mapper中sql语句<selectid="getUserLi......
  • try-except-else-finally
    1'''21.语法:3try:4#可能引发异常的代码5exceptExceptionType1:6#处理异常类型1的代码7exceptExceptionType2:8#处理异常类型2的代码9else:10#如果没有发生异常,执行此处的代码11final......
  • 2023巅峰极客 Crypto Rosita
    解题思路根据以上方法求出模数pdeffind_gcd(numbers):#求c中各元素的最大公约数result=numbers[0]fornuminnumbers[1:]:result=gcd(result,num)returnresultx=[(471351354539958688729428118750100914168908093467492698485305204663714......
  • 【codevs3012】线段覆盖4
      #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;structhp{ intai,bi,ci;}a[1005];boolcmp(hpa,hpb){ returna.bi<b.bi;}constintM=1e6+2;intn,i,j,k,maxn,f[1005];int......
  • WebApi 动态参数 dynamic 使用
    在调用WebAPI时,调用方法主要有get和post,但参数传递需要注意几点,下面简单介绍一下ajax调用时传参的几种方法:webapiusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Http;usingSystem.Web.Http;usingSystem.Web.......