.NetCore调用Soap接口

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


前言

添加服务引用的方式无法满足我请求Soap接口,所以写了个Soap帮助类,使用HttpClient的方式请求接口。


提示:以下是本篇文章正文内容,下面案例可供参考

一、简单的介绍一下Soap语法

一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:

  • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
  • 可选的 Header 元素,包含头部信息
  • 必需的 Body 元素,包含所有的调用和响应信息
  • 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

Soap消息的基本结构

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>
...
</soap:Header>

<soap:Body>
...
  <soap:Fault>
  ...
  </soap:Fault>
</soap:Body>

</soap:Envelope>

二、使用步骤

1.修改appsettings.json配置文件

在配置文件中添加Soap接口配置项,比如请求的Soap接口地址、用户和密码等。

代码如下(示例):

  "Soap": {
    "Address": "https://xxx.com/xxx/soap",
    "LoginId": "xxxxxx",
    "Password": "xxxxxx"
  },

2.新建SoapOptions类

SoapOptions类用于跟appsettings.json配置文件中的soap配置项做映射,方便使用。

代码如下(示例):

    /// <summary>
    /// 接口配置项
    /// </summary>
    public class JetPlanSoapOptions
    {
        /// <summary>
        /// 请求地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 认证ID
        /// </summary>
        public string LoginId { get; set; }
        /// <summary>
        /// 认证密码
        /// </summary>
        public string Password { get; set; }
    }

在Startup文件中的ConfigureServices方法里给配置项做映射,在这里我用的是Abp的框架,所以在契约模块ContractsModule中添加。

var Configuration = context.Services.GetConfiguration();
context.Services.Configure<CFPSoapOptions>(Configuration.GetSection("CFPSoap"));

3.新建Soap帮助类

代码如下(示例):

   public class SoapHelper
    {
        private readonly SoapOptions _options;

        public SoapClient(IOptions<SoapOptions> options)
        {
            _options = options.Value;
        }

        public async Task<XDocument> RequestAsync(CdbRequest cdbRequest)
        {
            string soapXml = @$"
<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
    <soapenv:Body>
        <JP_CustDB_Request>
           <custID>{_options.CustId}</custID>
           <custPwd>{_options.CustPwd}</custPwd>
           {cdbRequest}
        </JP_CustDB_Request>
    </soapenv:Body>
</soapenv:Envelope>";

            var httpClientHandler = new HttpClientHandler
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true
            };
            HttpClient client = new HttpClient(httpClientHandler);

            HttpContent content = new StringContent(soapXml, Encoding.UTF8, "text/xml");
            content.Headers.Add("loginid", _options.LoginId);
            content.Headers.Add("password", _options.Password);

            var response = await client.PostAsync(_options.Address, content);
            var responseXml = await response.Content.ReadAsStringAsync();

            XDocument doc = XDocument.Parse(responseXml);

            var error = doc.Descendants(JetPlanCDBSoap.ErrorText).FirstOrDefault();
            if (error != null)
            {
                throw new Exception(error.Value);
            }

            return doc;
        }

        /// <summary>
        /// 反序列化对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="doc"></param>
        /// <param name="dbData"></param>
        /// <returns></returns>
        public T Deserialize<T>(XDocument doc, string dbData) where T : class
        {
            var data = doc.Descendants(dbData).First();
            var serializer = new XmlSerializer(typeof(T));
            var result = serializer.Deserialize(data.CreateReader()) as T;
            return result;
        }

        /// <summary>
        /// 序列化对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public string Serialize<T>(T t) where T : class
        {
            var serializer = new XmlSerializer(typeof(T));
            var str = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(str);
            serializer.Serialize(writer, t);
            return str.ToString();
        }

        /// <summary>
        /// 生成请求内容
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public string MakeRequestContent<T>(T t) where T : class, new()
        {
            var xmlStr = Serialize(t);
            var doc = XDocument.Parse(xmlStr);
            var des = doc.Descendants(JetPlanCDBSoap.CDBRequest);
            var arr = des.First().Elements().Select(x => x);
            return string.Join("", arr);
        }
    }

4.新建请求参数类

   public class CdbRequest
    {
        /// <summary>
        /// Soap接口请求内容
        /// </summary>
        private readonly string RequestContent;

        public CdbRequest(string requestContent)
        {
            RequestContent = requestContent;
        }

        public CdbRequest()
        {

        }
    }

5.调用

   CdbRequest request = new CdbRequest(requestContent);
   var doc = await _soapClient.RequestAsync(request);

总结

请求Soap的过程还是比较简单的,大概就是根据参数请求Soap接口,把响应后的XML数据进行处理。文章来源地址https://www.toymoban.com/news/detail-442537.html

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

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

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

相关文章

  • C#引用Web Service 类型方法,添加搜索本地服务器Web Service 接口调用方法

    wsdl首先保证现在网络能调用web service接口,右键项目添加服务引用 点击高级 添加web服务 输入搜索的服务器接口,选中你要添加调用的方法即可 添加完成调用方法

    2024年02月13日
    浏览(43)
  • nacos实现Java和.NetCore的服务注册和调用

    用nacos作为服务注册中心,如何注册.NetCore服务,如何在Java中调用.NetCore服务呢?可以分为下面几个步骤:   0.运行nacos   1.开发.net core服务,然后调用nacos提供的.net core sdk注册服务。   2.开发Java服务,然后注册服务。   3.用RestTemplate调用.net core服务。   4.用OpenFeign调用服务

    2024年01月17日
    浏览(44)
  • Java调用https接口添加证书

    将代码复制到工程中  执行完毕没有报错会在工程下面生成jssecacerts文件 将文件放到jdk/jre/lib/security/路径下,具体试实际路径为准,我存放的位置是: /usr/local/apps/jdk1.7.0_79/jre/lib/security/jssecacerts 在调用https接口的实现类中加入以下代码,指定证书位置: 注意:hostname.equals(\\\"

    2024年02月12日
    浏览(48)
  • 调用openai接口的正确打开方式

    调用openai接口的正确打开方式: 为更好使用openai的功能,技术专家建议用py3.10。我问chatgpt它说只要py3.6及以上就行。我个人建议尽可能用anaconda较新的,但用anaconda2022.10的版本即可,可适配python3.10或python3.11。2023.03上新的anaconda仍有难以解决的bug,不推荐(安装后打不开,报

    2024年02月08日
    浏览(47)
  • 浏览器POST方式调用接口

    现在大部分都是前后端分离项目,此次开发在后端用到了 session 存储用户信息,恰巧接口调用方式为 POST 方式调用,使用浏览器登录成功之后使用 postman 调用是行不通的,所以我们还是得使用浏览器调用,但是在浏览器地址栏输入接口地址默认是 get 请求方式,最终发现了解

    2024年02月16日
    浏览(45)
  • Web Service接口的请求、调用方式

    1、SOAP(Simple Object Access Protocol):是一种基于XML的消息协议,常用于Web Service接口之间的通信。SOAP消息可以使用HTTP、SMTP等协议进行传输。 2、RESTful(Representational State Transfer):是一种基于HTTP协议的Web Service架构风格。RESTful风格的Web Service接口使用HTTP协议的GET、POST、PUT、

    2024年02月09日
    浏览(74)
  • java远程调用接口、URL的方式

    1.spring 框架提供的 RestTemplate 类可用于在应用中调用 rest 服务,它简化了与 http 服务的通信方式,统一了 RESTful 的标准,封装了 http 链接, 我们只需要传入 url 及返回值类型即可。相较于之前常用的 HttpClient,RestTemplate 是一种更优雅的调用 RESTful 服务的方式。 2.在 Spring 应用程

    2024年02月07日
    浏览(37)
  • C#使用post方式调用接口获取Token及调用网页地址

     IP、Port表示地址及端口,可配置或写死 public string PostDate(string IP,string Port)         {             //设置参数             string content= \\\"{\\\"userName\\\":\\\"\\\" 0000 \\\"\\\"\\\" +                  \\\",\\\"password\\\":\\\"123456\\\"}\\\";             //填充路径             string strUrl = string.Format(\\\"http://{0}:

    2023年04月08日
    浏览(38)
  • 用Restful方式调用WebService接口(需认证)

    一个可以调用的 WebService接口 调用WebService接口的 SoapUI工具 调用Rest接口的 Postman/Apipost工具 首先接口在浏览器里访问是这样的,一个需要认证的接口 打开SoapUI工具,new一个Project,自定义一下名称和粘贴你的wsdl地址    解析wsdl的时候弹出提示输入账号密码,跟浏览器那边一样

    2024年02月13日
    浏览(40)
  • Postman进行Soap webservice接口测试

    许多人认为Postman是高级REST客户端,Postman是处理通过HTTP发送的请求的工具。其实Postman也可以测试与协议无关的SOAP webservice api接口。 要使用Postman发出SOAP请求,请执行以下操作: 1、提供SOAP端点作为URL,可以使用SOAP的WSDL的路径作为URL。 2、将请求方法设置为POST。 3、Body中选

    2024年01月20日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包