首页 > 编程语言 >C#远程调用WebService

C#远程调用WebService

时间:2023-09-06 11:23:34浏览次数:42  
标签:调用 WebService C# args pType Add var new string

        /// <summary>
        /// 远程调用WebService
        /// </summary>
        /// <param name="url">以wsdl结尾的url地址</param>
        /// <param name="method">要调用的方法名</param>
        /// <param name="args">参数,按顺序传递</param>
        /// <returns></returns>
        public static object InvokeWebService(string url, string method, params object[] args)
        {
            var @namespace = new CodeNamespace(nameof(InvokeWebService));
            var client = new System.Net.WebClient();
            var stream = client.OpenRead(url);
            var description = ServiceDescription.Read(stream);
            var descriptionImporter = new ServiceDescriptionImporter();
            descriptionImporter.AddServiceDescription(description, string.Empty, string.Empty);
            var compileUnit = new CodeCompileUnit();
            compileUnit.Namespaces.Add(@namespace);
            var clientProtocol = new DiscoveryClientProtocol();
            clientProtocol.DiscoverAny(url);
            clientProtocol.ResolveAll();
            foreach (var osd in clientProtocol.Documents.Values)
            {
                if (osd is ServiceDescription) descriptionImporter.AddServiceDescription((ServiceDescription)osd, null, null); ;
                if (osd is XmlSchema) descriptionImporter.Schemas.Add((XmlSchema)osd);
            }
            descriptionImporter.Import(@namespace, compileUnit);
            var compilerParameters = new CompilerParameters
            {
                GenerateExecutable = false,
                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");
            var compilerResults = new Microsoft.CSharp.CSharpCodeProvider().CompileAssemblyFromDom(compilerParameters, compileUnit);
            if (compilerResults.Errors.HasErrors)
            {
                var sb = new StringBuilder();
                foreach (var ce in compilerResults.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }

            var type = compilerResults.CompiledAssembly.GetType($"{@namespace}.{description.Services[0].Name}", true, true);
            var mi = type.GetMethod(method);
            var paramsInfo = mi.GetParameters();
            if (args.Length != paramsInfo.Length)
            {
                throw new Exception("提供的参数数量错误");
            }
            var paramArr = new object[args.Length];
            for (int i = 0; i < args.Length; i++)
            {
                var pType = paramsInfo[i].ParameterType;

                if (pType.IsValueType || typeof(string).Equals(pType))
                {
                    paramArr[i] = Convert.ChangeType(args[i], pType);
                }
                else
                {
                    if (args[i] is string)
                    {
                        paramArr[i] = Newtonsoft.Json.JsonConvert.DeserializeObject(args[i].ToString(), pType);
                    }
                    else
                    {
                        throw new Exception($"提供的参数类型有误,参数需要{pType.Name}类型,而传的是{args[i].GetType().Name}类型");
                    }
                }
            }
            return mi.Invoke(Activator.CreateInstance(type), paramArr);
        }

标签:调用,WebService,C#,args,pType,Add,var,new,string
From: https://www.cnblogs.com/rossing/p/17681786.html

相关文章

  • Go如何自动解压缩包?如何读取docx/doc文件内容?
    在开发过程中,我们常常需要处理压缩包和文档文件。本文将介绍如何使用Go语言自动解压缩包和读取docx/doc文件。一、解压缩包压缩包格式常见的压缩包格式有zip、gzip、bzip2等。在Go语言中,使用archive/zip、compress/gzip、compress/bzip2包可以轻松地处理这些格式......
  • centos7 配置redis设置开机自动启动
    centos7以上是用Systemd进行系统初始化的,Systemd是Linux系统中最新的初始化系统(init),它主要的设计目标是克服sysvinit固有的缺点,提高系统的启动速度。Systemd服务文件以.service结尾,比如现在要建立redis为开机启动,如果用yuminstall命令安装的,yum命令会自动创建redis.servic......
  • 在线CAD的SDK如何集成到网页系统-关于MxCad项目二次开发插件集成
    前言1.很多单位拥有着数量庞大的DWG图纸,部门之间传统的图纸管理和沟通,效率较为低下,而将CAD图纸的浏览,编辑,审图,签章等工作集成到自己的网页系统,将会显著提高工作效率和企业的竞争力。集成到网页系统需要我们在后台服务器部署webcadsdk,部署后的操作界面效果如下: 2.在线CAD功......
  • ICML 2023 | 神经网络大还是小?Transformer模型规模对训练目标的影响
    前言 本文研究了Transformer类模型结构(configration)设计(即模型深度和宽度)与训练目标之间的关系。结论是:token级的训练目标(如maskedtokenprediction)相对更适合扩展更深层的模型,而sequence级的训练目标(如语句分类)则相对不适合训练深层神经网络,在训练时会遇到over-smoothin......
  • Codeforces Round 406 (Div. 2) D. Legacy 线段树优化建图
    传送门题目大意:给定n个点,m个操作,和起点s。其中n和q大于等于1小于等于1e5,s大于等于1小于等于n其中m个操作有三种情况:  1.输入1uvval表示从u号点向v号点连一个权值为val的有向边,其中1<=u<=n,1<=v<=n,1<=val<=1e9  2.输入2ulrval表示从u号点......
  • 【ICML2022】Understanding The Robustness in Vision Transformers
    来自NUS&NVIDIA文章地址:[2204.12451]UnderstandingTheRobustnessinVisionTransformers(arxiv.org)项目地址:https://github.com/NVlabs/FAN一、MotivationCNN使用滑动窗的策略来处理输入,ViT将输入划分成一系列的补丁,随后使用自注意力层来聚合补丁并产生他们的表示,ViT的......
  • 数字孪生和BIM/CIM
    相关概念BIM和CIM的教材:《BIM工作指南》、《CIM技术原理与应用》、《BIM与建筑设计》、《CIM与城市规划》、《BIM在建筑设计中的应用》、《BIM在结构设计中的应用》、《CIM在城市规划与管理中的应用》《新型智慧城市概论》、《新型智慧城市资源与规划》、《新型智慧城市设计与建......
  • ssh关闭之后 nginx tomcat mysql服务也被关了
    linux启动tomcat后,关闭ssh连接,tomcat进程停止 linux版本OpenSSH_8.3p1,OpenSSL1.0.2k-fips 26Jan2017老师给的建议是ssh版本降级到7.4  太难了没找到解决办法 最后找到下边文章在sshd@service中加入 KillMode=process配置 并用nohup启服务 生效  ......
  • 论文精读:带有源标签自适应的半监督域适应(Semi-Supervised Domain Adaptation with Sou
    Semi-SupervisedDomainAdaptationwithSourceLabelAdaptation具有源标签适应的半监督域适应原文链接Abstract文章指出当前的半监督域适应(Semi-SupervisedDomainAdaptation,SSDA)方法通常是通过特征空间映射和伪标签分配将目标数据与标记的源数据对齐,然而,这种面向源数......
  • Elasticsearch
    ES(分布式、开源、查询)传统数据一般会分三个方向:结构化数据、非结构化数据、半结构化数据结构化数据:一般每个字段之间都是有关系的,例如mysql的主键唯一id代表了该条数据的唯一定位(mysql、mongodb)非结构化数据:无法用二维表结构来设计,文章、日志、视频、图片等等(mongodb、redis)......