【C#】标准WebService Soap1.1 兼容 ContentType: application/xml

一、问题描述

1.1 ESB平台要求

  • ContentTypeapplication/xml
  • Soap协议版本1.1

1.2 提供的 WebService 接口

  • 语言:C#
  • 目标框架.NetFramework 4.6.1

1.3 Postman 测试结果

HTTP Error 415.0 - Unsupported Media Type

服务器无法为请求提供服务,因为不支持该媒体类型。
最可能的原因:
所请求文件的格式已由服务器配置为不可进行下载。

可尝试的操作:
确认所请求文件的格式有效。

Detailed Error Information:

ModuleManagedPipelineHandlerRequested URLhttp://localhost:55305/WebService.asmx?op=callBussiness
NotificationExecuteRequestHandlerPhysical Path…\ESBWebService.asmx
HandlerWebServiceHandlerFactory-Integrated-4.0Logon Method匿名
Error Code0x00000000Logon User匿名

More Information:
如果服务器因不支持该文件类型而无法为请求提供服务,就会出现此错误。
View more information »

二、问题说明

C# 使用创建的标准WebService 只支持以下ContentType类型

  • SOAP 1.1text/xml; charset=utf-8
  • SOAP 1.2application/soap+xml; charset=utf-8
  • HTTP POSTapplication/x-www-form-urlencoded

综上所述,要想解决此问题,由以下两种途径:

  • ESB平台人员沟通,要求使用WebService所支持的媒体类型text/xml;
  • 自己扩展SOAP,拦截application/xml类型的请求

三、解决方案

3.1 与ESB平台人员沟通,要求使用WebService所支持的媒体类型text/xml;

在这里插入图片描述

3.2 自己扩展SOAP,拦截application/xml类型的请求

要在C# WebService 启动服务时支持application/xml文件类型,您可以通过在 WebService 服务代码中添加一个 SOAP 扩展来实现。

3.2.1 扩展 SoapExtensionAttribute

[AttributeUsage(AttributeTargets.Method)]
public class ESBSoapExtensionAttribute : SoapExtensionAttribute
{private int priority;public ESBSoapExtensionAttribute(){}public override Type ExtensionType{get { return typeof(ESBSoapExtension); }}public override int Priority{get { return priority; }set { priority = value; }}
}

3.2.2 扩展 SoapExtension

ProcessMessage中判断ContentType是不是"application/xml",如果是则替换为可以被解析的"text/xml"

public class ESBSoapExtension : SoapExtension
{public ESBSoapExtension extension;public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute){return extension ?? (extension = new ESBSoapExtension());}public override object GetInitializer(Type serviceType){return extension ?? (extension = new ESBSoapExtension());}public override void Initialize(object initializer){//base.Initialize(initializer);}public override void ProcessMessage(SoapMessage message){// 检查请求头Content-Type是否为"application/xml"try{switch (message.Stage){case SoapMessageStage.BeforeDeserialize:if (message is SoapServerMessage serverMessage && serverMessage.ContentType.Contains("application/xml")){// 设置响应头Content-Type为"application/xml"serverMessage.ContentType = "text/xml";}break;case SoapMessageStage.BeforeSerialize:break;case SoapMessageStage.AfterSerialize:break;case SoapMessageStage.AfterDeserialize:// 在反序列化之后进行处理(响应阶段)break;default:break;}}catch(Exception exp){}}
}

3.2.3 在方法callBussiness上注入扩展

 [WebMethod(Description = "调用业务")][ESBSoapExtension(Priority =1)]public string callBussiness(string message){return message;}

** 完整代码**

using System;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System.Xml.Serialization;
using Rss_WebServer.code;[AttributeUsage(AttributeTargets.Method)]
public class ESBSoapExtensionAttribute : SoapExtensionAttribute
{private int priority;public ESBSoapExtensionAttribute(){}public override Type ExtensionType{get { return typeof(ESBSoapExtension); }}public override int Priority{get { return priority; }set { priority = value; }}}public class ESBSoapExtension : SoapExtension
{public ESBSoapExtension extension;public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute){return extension ?? (extension = new ESBSoapExtension());}public override object GetInitializer(Type serviceType){return extension ?? (extension = new ESBSoapExtension());}public override void Initialize(object initializer){//base.Initialize(initializer);}public override void ProcessMessage(SoapMessage message){// 检查请求头Content-Type是否为"application/xml"try{switch (message.Stage){case SoapMessageStage.BeforeDeserialize:if (message is SoapServerMessage serverMessage && serverMessage.ContentType.Contains("application/xml")){// 设置响应头Content-Type为"application/xml"serverMessage.ContentType = "text/xml";}break;case SoapMessageStage.BeforeSerialize:break;case SoapMessageStage.AfterSerialize:break;case SoapMessageStage.AfterDeserialize:// 在反序列化之后进行处理(响应阶段)break;default:break;}}catch(Exception exp){}}
}namespace ESB
{/// <summary>/// WebService 的摘要说明/// </summary>[WebService(Namespace = "http://esb.webservice")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)][System.ComponentModel.ToolboxItem(false)]// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 [System.Web.Script.Services.ScriptService]public class WebService : System.Web.Services.WebService{public override object GetService(Type service){return base.GetService(service);}public WebService(){//this.Application.sathis.Context.Request.ContentType = "application/xml";}[WebMethod(Description = "调用业务")][ESBSoapExtension(Priority =1)]public string callBussiness(string message){try{if (string.IsNullOrEmpty(message)){message = WebServiceAnalysis(base.Context.Request, nameof(message));}return message;}catch (Exception exp){return exp.Message;}}/// <summary>/// 重新解析 WebService/// </summary>/// <param name="request"></param>/// <param name="name"></param>/// <returns></returns>private string WebServiceAnalysis(System.Web.HttpRequest request, string name){try{if (request.ContentLength == 0){throw new Exception($"Body(xml数据) 无数据");}// 获取请求内容Stream inputStream = request.InputStream;// 重新获取内容inputStream.Position = 0;// 读取请求主体内容using (StreamReader reader = new StreamReader(inputStream, Encoding.UTF8)){string requestBody = reader.ReadToEnd();XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(requestBody);XmlNode strNode = xmlDoc.SelectSingleNode($"//{name}");if (strNode != null){return strNode.InnerText;}else{throw new Exception($"未在Body(xml数据)找到{name}节点");}}}catch (Exception exp){throw exp;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/156778.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用什么工具来画UML?

2023年10月9日&#xff0c;周一晚上 目录 我的决定 关于rational rose UML工具有哪些 相关资料 我的决定 我决定用plantUML、draw.io或starUML就可以了 其实没必要在意工具&#xff0c; 重要的是能把图画出来、把图画好画规范&#xff0c; 重要的是知道怎么去画图、把意…

vue3 + element Plus实现表格根据关键字合并行,并实现行的增删改操作

根据关键字合并表格 1.实现初始化表格2.实现添加班级与学生的功能3.添加的弹窗4.删除班级5.删除学生 首先看最终实现的效果 1.实现初始化表格 这里主要用到的是表格的span-method这个方法 <template><div class"main-page"><div class"flex-en…

多线程锁-死锁案例和排查命令

3.5 死锁及排查 3.5.1 概念 死锁是指两个或两个以上的线程在执行过程中&#xff0c;因抢夺资源而造成的一种互相等待的现象&#xff0c;若无外 力干涉&#xff0c;则它们无法再继续推进下去。 产生原因&#xff1a; 系统资源不足进程运行推进顺序不合适系统资源分配不当 3…

MongoDB 索引和常用命令

一、基本常用命令 1.1 案例需求 存放文章评论的数据存放到 MongoDB 中&#xff0c;数据结构参考如下&#xff0c;其中数据库为 articledb&#xff0c; 专栏文章评论 comment 字段名称 字段含义 字段类型 备注 _id ID ObjectId或String Mongo的主键的字段 articlei…

Android Studio新建项目教程

Android Studio新建项目教程 一、创建新项目 二、选择空白页项目类型 配置然后finish 等待项目完成初试化 等待初始化结束&#xff0c;创建完成 三、运行创建的APP

京东历史价格数据接口,京东商品历史价格接口,京东API接口

京东商品历史价格数据接口采集方法如下&#xff1a; 注册京东开发者账号&#xff0c;并创建应用&#xff0c;获取到应用ID&#xff08;appID&#xff09;、应用密钥&#xff08;appSecret&#xff09;以及访问令牌&#xff08;accessToken&#xff09;。获取接口请求地址。根据…

华为数通方向HCIP-DataCom H12-831题库(单选题:241-260)

第241题 某园区部署了IPV6进行业务测试,该网络中有4台路由器(R1R2、R3和R),运行OSPFV3实现Pv6网络的互联互通。有一台新的路由器R5需要接入网络进行测试,某工程师通过在R4的OSPFV3进程中引入直连路由,实现园区网内的设备能够访问R5的GEO/0/1口地址。关千该场景的描述,错误…

云计算到底牛x在哪里?

你们好&#xff0c;我的网工朋友。 云计算已经霸屏行业有段时间了&#xff0c;但很多粉丝朋友还是不太明白什么是云计算&#xff0c;为什么要学云计算。 从宏观来说&#xff0c;其实云计算的优点很多。 就和传统模式相比&#xff0c;云计算在六个维度都有显著的提升点。 比…

Vue-2.7自定义指令

自定义指令 自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能 例如需求&#xff1a;当页面加载时&#xff0c;让元素将获得焦点&#xff08;autofucus在safari浏览器有兼容性&#xff09; 操作dom&#xff1a;dom元素.focus() 太麻烦&#xff01;…

Zend Framework 3.1.3 gadget chain

前言 在推特上的PT SWARM账号发布了一条消息。 一个名为Zend Framework的php框架出现了新的gadget chain&#xff0c;可导致RCE。笔者尝试复现&#xff0c;但失败了。所幸&#xff0c;我基于此链&#xff0c;发现在这个框架的最新版本中的另一条链。 复现过程 这里使用vscod…

ArcGIS/GeoScene脚本:基于粒子群优化的支持向量机回归模型

参数输入 1.样本数据必须包含需要回归的字段 2.回归字段是数值类型 3.影响因子是栅格数据&#xff0c;可添加多个 4.随机种子可以确保每次运行的训练集和测试集一致 5.训练集占比为0-1之间的小数 6.迭代次数&#xff1a;迭代次数越高精度越高&#xff0c;但是运行时间越长…

机器学习 - 似然函数:概念、应用与代码实例

目录 一、概要二、什么是似然函数数学定义似然与概率的区别重要性举例 三、似然函数与概率密度函数似然函数&#xff08;Likelihood Function&#xff09;定义例子 概率密度函数&#xff08;Probability Density Function, PDF&#xff09;定义 区别与联系 四、最大似然估计&am…

网络流量安全分析-工作组异常

在网络中&#xff0c;工作组异常分析具有重要意义。以下是网络中工作组异常分析的几个关键点&#xff1a; 检测网络攻击&#xff1a;网络中的工作组异常可能是由恶意活动引起的&#xff0c;如网络攻击、病毒感染、黑客入侵等。通过对工作组异常的监控和分析&#xff0c;可以快…

8年经验之谈 —— 如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 i STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例&#xff09;。 如下图所示&#xff1a; W…

单目标应用:墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解微电网优化--MATLAB代码

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、墨西哥蝾螈优化算法MAO 墨西哥蝾螈优化算法&#xff08;Mexican Axolotl Optimization&#xff0c;MAO&#xff09;由Yenny Villuendas-Rey 1等人于2021…

javaweb:mybatis:mapper(sql映射+代理开发+配置文件之设置别名、多环境配置、顺序+注解开发)

1.0版本 sql映射文件实现 流程 首先程序进入启动类MyBatisDemo.java中&#xff0c;读取配置文件mybatis-config.xml 再由mybatis-config的mappers属性 <mappers><mapper resource"UserMapper.xml"></mapper></mappers>找到sql映射文件Use…

HarmonyOS学习 -- ArkTS开发语言入门

文章目录 一、编程语言介绍二、TypeScript基础类型1. 布尔值2. 数字3. 字符串4. 数组5. 元组6. 枚举7. unknown8. void9. null 和 undefined10. 联合类型 三、TypeScript基础知识条件语句if语句switch语句 函数定义有名函数和匿名函数可选参数剩余参数箭头函数 类1. 类的定义2.…

uniapp 微信小程序 vue3.0+TS手写自定义封装步骤条(setup)

uniapp手写自定义步骤条&#xff08;setup&#xff09; 话不多说 先上效果图&#xff1a; setup.vue组件代码&#xff1a; <template><view class"stepBox"><viewclass"stepitem"v-for"(item, index) in stepList":key"i…

Matlab之查询子字符串在字符串中的起始位置函数strfind

一、功能 strfind函数用于在一个字符串中查找指定的子字符串&#xff0c;并返回子字符串在字符串中的起始位置。 二、语法 indices strfind(str, pattern) 其中&#xff0c;str是要进行查找的字符串&#xff0c;pattern是要查找的子字符串。 函数会返回一个由子字符串在字…

区分Cookie,Session,Token

Cookie 由于HTTP 协议是一个无状态协议&#xff0c;客户端向服务器发请求&#xff0c;服务器返回响应。并且你每次都要输入账号和密码进行登录&#xff0c;对于用户来说非常的麻烦&#xff01;这种背景下&#xff0c;就产生了 Cookie cookie 存储在客户端&#xff1a; cookie…