c#对接webservice接口

这篇具有很好参考价值的文章主要介绍了c#对接webservice接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

工具类

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;
        }
    }
}

调用方式:文章来源地址https://www.toymoban.com/news/detail-712487.html

            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");

到了这里,关于c#对接webservice接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C# 调用SAP WebService接口(SoapUI Postman)

    C# 调用SAP WebService接口(SoapUI Postman)

    SAP wsdl地址发放在浏览器中是需要输入用户名密码进行认证的 将wsdl地址放到SoapUI进行解析 输入用户名密码 左边就是请求的XML格式,右边是接口返回内容,点击运行就可以看到结果 Request1的地址就是我们需要调用的地址(这里提供的域名和wsdl 的域名不一致,需要换成wsdl的域

    2024年02月09日
    浏览(12)
  • 用Python编程实现百度自然语言处理接口的对接,助力你开发智能化处理程序

    用Python编程实现百度自然语言处理接口的对接,助力你开发智能化处理程序 随着人工智能的不断进步,自然语言处理(Natural Language Processing,NLP)成为了解决文本处理问题的重要工具。百度自然语言处理接口提供了一系列强大的功能,如提取、文本分类、情感分析等,

    2024年02月13日
    浏览(91)
  • C# .Net6 指定WSDL, 生成Webservice,调用该接口服务

    IDE: Microsoft Visual Studio Community 2022 (64 位) 平台:.Net6 协议:Soap协议 Xml格式 需要开发一个前置机程序, 用于和硬件程序交互, 已知条件是:嵌入式同事提供另一个约定好的*.wsdl文件作为双方通信的Webservice接口协议,对方是服务端,前置机是客户端 使用BasicHttpBinding 通过WS

    2024年02月04日
    浏览(11)
  • C# webservice 接收json数据 接口返回 远程服务器返回错误: (500) 内部服务器错误

    C# webservice 接收json数据 接口返回 远程服务器返回错误: (500) 内部服务器错误

    C# post 调用webservice 服务端接口,会返回上面那个错误,8成是发送的数据和接口不符合造成的。有2种情况 第一种情况如下:如果类型是默认request.ContentType = \\\"application/x-www-form-urlencoded\\\";这个类型 那么你发送数据和被调用接口参数名如果不对,则会报下图这个错 我发送的参数名

    2024年02月13日
    浏览(12)
  • C#实现SM2签名(对接医保接口注意事项)

    最近在做对接医保接口的项目,入参要求进行SM2签名(注意:是签名而非加密,开始理解成加密研究了一堆加密源码,使用提供的私钥也会报错,后面才发现SM2有专门的签名方法,而接口调用签名也就是 SM2签名 而非加密) 下面是说明适用于2022年云南省医保平台相关项目:

    2024年02月15日
    浏览(16)
  • Java发送WebService请求并解析数据(与大华DSS 7016s2设备对接为例)

    Java发送WebService请求并解析数据(与大华DSS 7016s2设备对接为例)

    最近项目需要与大华的监控设备做对接,需要使用WebService发送请求,并解析数据刷入数据库,总结了一套我认为好理解的方案: 首先了解一下WebService,跨语言,跨平台的远程调用技术。一共有三种,一般是采用的http、soap协议 。 我举例的这种就是基于soap协议的,我简单的理解就是

    2024年02月13日
    浏览(4)
  • 设计模式之美-实战二:如何对接口鉴权这样一个功能开发做面向对象分析?

    设计模式之美-实战二:如何对接口鉴权这样一个功能开发做面向对象分析?

            面向对象的三个环节:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。只知道OOA、OOD、OOP只能说有一个宏观了解,我们更重要的还是要知道“如何做”,也就是,如何进行面向对象分析、设计与编程。         本文结合一个真实的开发案例,从基

    2024年02月09日
    浏览(9)
  • webservice接口与HTTP接口学习笔记一、webservice 的概念

    webservice接口与HTTP接口学习笔记一、webservice 的概念

    目录:导读 一、webservice 的概念 二、webservice接口测试 三、HTTP接口 四、HTTP协议结构 Web 是使应用程序可以与平台和编程语言无关的方式进行相互通信的一项技术。Web 服务是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语

    2024年02月05日
    浏览(10)
  • Java 亚马逊Amazon spapi对接开发,java Sdk,授权和接口访问步骤详细说明

    Java 亚马逊Amazon spapi对接开发,java Sdk,授权和接口访问步骤详细说明

    确认是否收到通过sp-api开发人员资料申请。   创建一个策略,我们建议您将 IAM 策略命名为 SellingPartnerAPI 。     开发商名称:任意字符 开发者id :accessKeyId 客户端相关信息,包含clientId和clientSecret。 1.8.1访问需要的参数和数据如图 参数 说明 样例 roleArn 角色Arn,在角色中

    2024年02月03日
    浏览(9)
  • http 接口 和webService 接口

    HTTP接口和Web服务接口是两种不同的接口类型,它们在设计和使用上有一些区别。 HTTP接口: HTTP接口是基于HTTP协议进行通信的接口,使用HTTP请求方法(如GET、POST、PUT、DELETE)对资源进行操作。 数据传输通常采用各种数据格式,如JSON、XML、Form表单等。 HTTP接口通常以URL路径来

    2024年02月07日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包