c#对接webservice接口

2023-09-13 10:14:53

方式一:需要填写地址,不能映射每个方法

工具类

using System;
using System.CodeDom.Compiler;
using System.CodeDom;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web.Services.Description;
using System.Xml.Serialization;
using System.Web;
using System.Web.Caching;

namespace ReportTest
{
    public class WebServiceHelper
    {
        /// <summary>
        /// 生成dll文件保存到本地
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="className">类名</param>
        /// <param name="methodName">方法名</param>
        /// <param name="filePath">保存dll文件的路径</param>
        public static void CreateWebServiceDLL(string url, string className, string methodName, string filePath)
        {
            // 1. 使用 WebClient 下载 WSDL 信息。
            WebClient web = new WebClient();
            Stream stream = web.OpenRead(url);
            // 2. 创建和格式化 WSDL 文档。
            ServiceDescription description = ServiceDescription.Read(stream);
            //如果不存在就创建file文件夹
            if (Directory.Exists(filePath) == false)
            {
                Directory.CreateDirectory(filePath);
            }

            if (File.Exists(filePath + className + "_" + methodName + ".dll"))
            {
                //判断缓存是否过期
                var cachevalue = HttpRuntime.Cache.Get(className + "_" + methodName);
                if (cachevalue == null)
                {
                    //缓存过期删除dll
                    File.Delete(filePath + className + "_" + methodName + ".dll");
                }
                else
                {
                    // 如果缓存没有过期直接返回
                    return;
                }
            }

            // 3. 创建客户端代理代理类。
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
            // 指定访问协议。
            importer.ProtocolName = "Soap";
            // 生成客户端代理。
            importer.Style = ServiceDescriptionImportStyle.Client;
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
            // 添加 WSDL 文档。
            importer.AddServiceDescription(description, null, null);
            // 4. 使用 CodeDom 编译客户端代理类。
            // 为代理类添加命名空间,缺省为全局空间。
            CodeNamespace nmspace = new CodeNamespace();
            CodeCompileUnit unit = new CodeCompileUnit();
            unit.Namespaces.Add(nmspace);
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            CompilerParameters parameter = new CompilerParameters();
            parameter.GenerateExecutable = false;
            // 可以指定你所需的任何文件名。
            parameter.OutputAssembly = filePath + className + "_" + methodName + ".dll";
            parameter.ReferencedAssemblies.Add("System.dll");
            parameter.ReferencedAssemblies.Add("System.XML.dll");
            parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
            parameter.ReferencedAssemblies.Add("System.Data.dll");
            // 生成dll文件,并会把WebService信息写入到dll里面
            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
            if (result.Errors.HasErrors)
            {
                // 显示编译错误信息
                System.Text.StringBuilder sb = new StringBuilder();
                foreach (CompilerError ce in result.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(System.Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }
            //记录缓存
            var objCache = HttpRuntime.Cache;
            // 缓存信息写入dll文件
            objCache.Insert(className + "_" + methodName, "1", null, DateTime.Now.AddMinutes(5), TimeSpan.Zero, CacheItemPriority.High, null);
        }
    }
}

调用方法:

            // 读取配置文件,获取配置信息
            string url = "http://127.0.0.1:8080/integration_web/services/GEDataServices?wsdl";
            string className = "IGEDataServicesService";
            string methodName = "queryExamInfo";
            string filePath = "D:/my";
            // 调用WebServiceHelper
            WebServiceHelper.CreateWebServiceDLL(url, className, methodName, filePath);
            // 读取dll内容
            byte[] filedata = File.ReadAllBytes(filePath + className + "_" + methodName + ".dll");
            // 加载程序集信息
            Assembly asm = Assembly.Load(filedata);
            Type t = asm.GetType(className);
            // 创建实例
            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod(methodName);
            // 参数
            object[] args = { "<?xml version=\"1.0\" encoding=\"GBK\" ?><request><patientid></patientid><accessionid>ZH230911DR8141</accessionid></request>" };
            // 调用访问,获取方法返回值
            string result = method.Invoke(o, args).ToString();
            //输出返回值
            textBox1.AppendText("result is:" + result + "\r\n");

方式二:需要提前写好方法名,调用简单像调用类方法一样

using System;
using System.CodeDom.Compiler;
using System.CodeDom;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.IO;
using System.Web.Services.Description;

namespace ReportGetWS
{
    public enum EMethod
    {
        updCriticalValues,
        queryExamInfo,
        printFilm,
        downloadReport,
        updateReportStatus,
        queryFilmPrintStatus,
    }
    public class WSHelper
    {
        /// <summary>
        /// 输出的dll文件名称
        /// </summary>
        private static string m_OutputDllFilename;

        /// <summary>
        /// WebService代理类名称
        /// </summary>
        private static string m_ProxyClassName;

        /// <summary>
        /// WebService代理类实例
        /// </summary>
        private static object m_ObjInvoke;

        /// <summary>
        /// 接口方法字典
        /// </summary>
        private static Dictionary<EMethod, MethodInfo> m_MethodDic = new Dictionary<EMethod, MethodInfo>();

        /// <summary>
        /// 创建WebService,生成客户端代理程序集文件
        /// </summary>
        /// <param name="error"></param>
        /// <returns></returns>
        public static bool CreateWebService(out string error)
        {
            try
            {
                error = string.Empty;
                m_OutputDllFilename = "report.dll";
                m_ProxyClassName = "IGEDataServicesService";
                string webServiceUrl = "http://127.0.0.1:8080/integration_web/services/GEDataServices?wsdl";

                // 如果程序集已存在,直接使用
                if (File.Exists(Path.Combine(Environment.CurrentDirectory, m_OutputDllFilename)))
                {
                    BuildMethods();
                    return true;
                }
                //使用 WebClient 下载 WSDL 信息。
                WebClient web = new WebClient();
                Stream stream = web.OpenRead(webServiceUrl);
                //创建和格式化 WSDL 文档。
                if (stream != null)
                {
                    // 格式化WSDL
                    ServiceDescription description = ServiceDescription.Read(stream);
                    // 创建客户端代理类。
                    ServiceDescriptionImporter importer = new ServiceDescriptionImporter
                    {
                        ProtocolName = "Soap",
                        Style = ServiceDescriptionImportStyle.Client,
                        CodeGenerationOptions =
                            CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync
                    };
                    // 添加 WSDL 文档。
                    importer.AddServiceDescription(description, null, null);
                    //使用 CodeDom 编译客户端代理类。
                    CodeNamespace nmspace = new CodeNamespace();
                    CodeCompileUnit unit = new CodeCompileUnit();
                    unit.Namespaces.Add(nmspace);
                    ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                    CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                    CompilerParameters parameter = new CompilerParameters
                    {
                        GenerateExecutable = false,
                        // 指定输出dll文件名。
                        OutputAssembly = m_OutputDllFilename
                    };
                    parameter.ReferencedAssemblies.Add("System.dll");
                    parameter.ReferencedAssemblies.Add("System.XML.dll");
                    parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                    parameter.ReferencedAssemblies.Add("System.Data.dll");
                    // 编译输出程序集
                    CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                    // 使用 Reflection 调用 WebService。
                    if (!result.Errors.HasErrors)
                    {
                        BuildMethods();
                        return true;
                    }
                    else
                    {
                        error = "反射生成dll文件时异常";
                    }
                    stream.Close();
                    stream.Dispose();
                }
                else
                    error = "打开WebServiceUrl失败";
            }
            catch (Exception ex)
            {
                error = "异常:"+ex.Message;
                //Log.WriteLog(error);
            }
            return false;
        }

        /// <summary>
        /// 反射构建Methods
        /// </summary>
        private static void BuildMethods()
        {
            Assembly asm = Assembly.LoadFrom(m_OutputDllFilename);
            Type[] types = asm.GetTypes();
            Type asmType = asm.GetType(m_ProxyClassName);
            m_ObjInvoke = Activator.CreateInstance(asmType);
            var methods = Enum.GetNames(typeof(EMethod)).ToList();
            foreach (var item in methods)
            {
                var methodInfo = asmType.GetMethod(item);
                if (methodInfo != null)
                {
                    var method = (EMethod)Enum.Parse(typeof(EMethod), item);
                    m_MethodDic.Add(method, methodInfo);
                }
            }
        }
        /// <summary>
        /// 获取请求响应
        /// </summary>
        /// <param name="method"></param>
        /// <param name="para"></param>
        /// <returns></returns>
        public static string GetResponseString(EMethod method, params object[] para)
        {
            string result = string.Empty;
            try
            {
                if (m_MethodDic.ContainsKey(method))
                {
                    var temp = m_MethodDic[method].Invoke(m_ObjInvoke, para);
                    if (temp != null)
                        result = temp.ToString();
                }
            }
            catch { }
            return result;
        }
    }
}

调用方式:

            textBox1.AppendText("start get\r\n");
            string error = "";
            string param1 = "<?xml version=\"1.0\" encoding=\"GBK\" ?><request><patientid></patientid><accessionid>ZH230911DR8141</accessionid></request>";
            bool succ = WSHelper.CreateWebService(out error);
            textBox1.AppendText("error is:" + error + "\r\n");
            textBox1.AppendText("succ is:" + succ + "\r\n");
            string result = WSHelper.GetResponseString(EMethod.queryExamInfo, param1);
            textBox1.AppendText("result is:" + result + "\r\n");

更多推荐

【已解决】ModuleNotFoundError: No module named ‘torchnet‘

问题描述今天在复现Chinese-Chatbot-PyTorch-Implementation的时候出现了一些问题:包括且不限于ModuleNotFoundError:Nomodulenamed'torchnet',ModuleNotFoundError:Nomodulenamed'fire',ModuleNotFou

重磅!OpenAI将发布DALL·E 3,多模态ChatGPT来了!

9月21日凌晨,OpenAI在官网宣布,在今年10月份将通过API向ChatGPTPlus和企业版用户提供全新文本生成图片产品——DALL·E3。这意味着,ChatGPT在DALL·E3加持下将开启久违的多模态输出模式,用户通过文本就能直接在ChatGPT中生成各种类型图片。例如,在ChatGPT中输入,生成一只可爱的

UE5学习笔记(1)——从源码开始编译安装UE5

目录0.前期准备1.Gitbashhere2.克隆官方源码。3.选择安装分支4.运行Setup.bat,下载依赖文件5.运行GenerateProjectFiles.bat生成工程文件6.生成完成,找到UE5.sln/UE4.sln7.大功告成0.前期准备0.1在windows的话,建议装一个Gitbash,同时还要有

多线程并发或线程安全问题如何解决

1、通过volatile关键字修饰变量,可以实现线程之间的可见性,避免变量脏读的出现,底层是通过限制jvm指令的重新排序实现的,适用于一个线程修改,多个线程读的场景。2、通过synchronized锁(任意对象)来实现线程同步,自动锁的思想,底层实现原理:当又线程进入同步代码快之后,利用jvm的计数器将锁的标记位置为1

开学季ipad电容笔哪款好?便宜的电容笔推荐

随着数码产品不断地更新和添加新的特性功能,iPad的平板已经可以和笔记本电脑相媲美了。而时至今日,随着技术的进步,ipad已经不再是一款单纯的娱乐设备,而是一款集学习、绘画、办公于一体的功能。为提高生产力,搭配上一款好用的电容笔是很有必要的。随着苹果Pencil的普及,国产平板电脑也在迅速发展,下面我就为大家介绍几款高

抖音矩阵系统-60+自媒体平台一键发布-短视频获客系统

当老板做企业的,想在抖音上做生意的,一定一定要开通蓝V企业号线索版来做矩阵。看看我每天的线索都是999+,客服都接待不过来,现在还有300个客资未分配,抖音都在推了企业员工号的玩法,你还在质疑什么?在抖音上做矩阵,真的能将你的生意放大100倍!你只有一个账号,每天就发一条视频,而我们的客户有几百个账号,每天发上千条视频

软件需求文档、设计文档、开发文档、运维文档大全

在软件开发过程中,文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程,还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用,以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档要求。引言软件开发文档是一种用于记录、沟通和理解软件开发过程的工具。它不仅提供了软件的详细描述,而

从 AI 代码生成模型到 AI 编程助手应用实战

▼最近直播超级多,预约保你有收获近期直播:《从AI编程助手到AIAgent应用实战》随着科技的发展,软件设计方式也在不断地演进,从最初的面向机器,到面向过程,再到面向对象,面向领域,最后到现在快要成为可能的面向自然语言。在软件设计开发领域,我们一直在探索更高效的开发方式—1—AI编程的发展史AI编程的前身,自动代码生成

OJ练习第178题——收集树中金币

收集树中金币力扣链接:2603.收集树中金币题目描述给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处

Linux的Redis集群搭建-主从集群哨兵模式

上次教大家在linux中安装单机版本的redis:Linux安装Redis(图文解说详细版)这次我们讲一下Linux安装redis的集群版本文章目录🌴准备redis环境🌴第一步,下载redis🌴第二步,传输到三台服务器中🌴第三步,解压文件🌴第四步,安装gcc环境🌴第五步,编译🌴第六步,安装🌴主从复制集群

代码随想录算法训练营Day48 (day47休息) | 动态规划(9/17) LeetCode 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

来到了新的一块内容:打家劫舍问题。第一题198.HouseRobberYouareaprofessionalrobberplanningtorobhousesalongastreet.Eachhousehasacertainamountofmoneystashed,theonlyconstraintstoppingyo

热文推荐