从c#调用web服务并发送未转义的xml
本文关键字:转义 xml 并发 调用 web 服务 | 更新日期: 2023-09-27 18:18:40
我正在尝试将应用程序与第三方web服务集成。我必须调用的方法的签名是这样的(由VS代理生成器生成):
string MyFoo(string param1, string param2, string param3, string someXml)
现在对于前3个参数没有问题。根据供应商规范,第四个参数应该包含"包装在CDATA块中的未转义xml",如下所示:
<![CDATA[<?xml version="1.0" encoding="utf-8"?><rootNode></rootNode>]]>
现在,c#转义(正如我所期望的那样)所有必须转义的字符,主要是"<"answers">"字符,甚至在CDATA语句中,导致如下内容:
<![CDATA[<?xml version="1.0" encoding="utf-8"?><rootNode></rootNode>]]>
据我所知,这是一个正确的行为,没有办法覆盖它,因为它可能会产生一个错误的请求(无效的soap消息),甚至一个安全问题。
有没有人知道我错过了什么,不知道的东西,或者这是正确的,第三方网络服务的期望不能遵守?
谢谢。
到今天为止,我已经在类似的问题上折腾了2天了。对我来说唯一可行的解决方案是自己编写服务客户端(接口和客户端实现)。这将是一个问题,如果你的服务不时变化(你将无法重新生成/更新您的客户端3次点击)。让我告诉你我做了什么。
简单快捷的食谱:
- 复制生成的服务客户端接口并将其命名为IServiceClientExtended;
- 将someXml参数更改为XmlCDataSection someXml; MyFoo方法属性更改XmlSerializerFormatAttribute。使用 System.ServiceModel.OperationFormatUse。text from System.ServiceModel.OperationFormatUse.Encoded;
- 从IServiceClientExtended属性中删除GeneratedCodeAttribute如果您还没有这样做的话;
- 创建ServiceClient类(可以从已生成的类中复制),并将其实现和继承的接口更改为ClientBase, IServiceClientExtended;
- 创建所有所需的方法(或从生成的方法中复制)并更改方法签名以适应IServiceClientExtended接口(someXml应该是XmlCDataSection,记得吗?); 在您的代码中,使用您创建的ServiceClient类并将someXml参数转换为XmlCDataSection。你可以这样做:
XmlDocument doc = new XmlDocument();
var section = doc.CreateCDataSection(someXmlString);
string result = client.MyFoo(param1, param2, param3, section);
kasparaviReference.cs
做一点改动。需要将参数类型由string
修改为XmlCDataSection
private XmlCDataSection foo;
[System.Xml.Serialization.XmlElementAttribute(Order=2)]
public XmlCDataSection foo {
get {
return this.foo;
}
set {
this.foo = value;
this.RaisePropertyChanged("foo");
}
}
然后添加参数为XmlCDataSection
var xmlDocument = new XmlDocument();
var parameter = xmlDocument.CreateCDataSection("<foo></foo>");