从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语句中,导致如下内容:

&lt;![CDATA[&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;rootNode&gt;&lt;/rootNode&gt;]]&gt;

据我所知,这是一个正确的行为,没有办法覆盖它,因为它可能会产生一个错误的请求(无效的soap消息),甚至一个安全问题。

有没有人知道我错过了什么,不知道的东西,或者这是正确的,第三方网络服务的期望不能遵守?

谢谢。

从c#调用web服务并发送未转义的xml

到今天为止,我已经在类似的问题上折腾了2天了。对我来说唯一可行的解决方案是自己编写服务客户端(接口和客户端实现)。这将是一个问题,如果你的服务不时变化(你将无法重新生成/更新您的客户端3次点击)。让我告诉你我做了什么。

简单快捷的食谱:

  1. 复制生成的服务客户端接口并将其命名为IServiceClientExtended;
  2. someXml参数更改为XmlCDataSection someXml;
  3. MyFoo方法属性更改XmlSerializerFormatAttribute。使用 System.ServiceModel.OperationFormatUse。text from System.ServiceModel.OperationFormatUse.Encoded;
  4. IServiceClientExtended属性中删除GeneratedCodeAttribute如果您还没有这样做的话;
  5. 创建ServiceClient类(可以从已生成的类中复制),并将其实现和继承的接口更改为ClientBase, IServiceClientExtended;
  6. 创建所有所需的方法(或从生成的方法中复制)并更改方法签名以适应IServiceClientExtended接口(someXml应该是XmlCDataSection,记得吗?);
  7. 在您的代码中,使用您创建的ServiceClient类并将someXml参数转换为XmlCDataSection。你可以这样做:
XmlDocument doc = new XmlDocument();
var section = doc.CreateCDataSection(someXmlString);
string result = client.MyFoo(param1, param2, param3, section);

kasparavi是对的。其实很简单,只需要对Reference.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>");