从C#调用Web服务并发送未转义的xml

时间:2013-06-17 15:16:06

标签: c# .net xml web-services escaping

我正在尝试将应用程序与第三方Web服务集成。我必须调用的方法的签名是这样的(由VS代理生成器生成):

string MyFoo(string param1, string param2, string param3, string someXml)

现在前3个参数没有问题。根据供应商规范,第四个参数应包含“未转义的xml包装在CDATA块中”,如下所示:

<![CDATA[<?xml version="1.0" encoding="utf-8"?><rootNode></rootNode>]]>

现在,c#转义(我希望它会做)所有必须转义的字符,主要是“&lt;”和“&gt;”字符,即使在CDATA语句中,也会产生如下内容:

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

据我所知,这是一种正确的行为,并且无法覆盖它,因为它可能会生成错误的请求(无效的肥皂消息),甚至是安全问题。

有没有人知道我是否错过了什么,不知道什么,或者这是正确的,并且第三方网络服务的期望无法得到遵守?

感谢。

2 个答案:

答案 0 :(得分:1)

我一直在为&gt;的类似问题摆弄?截至今天2天。对我有用的唯一可行解决方案是自己编写服务客户端(接口和客户端实现)。如果您的服务不时更改(这将无法通过3次点击重新生成/更新您的客户端),这将是一个问题。 让我告诉我我做了什么。

简单快速的食谱:

  1. 复制生成的服务客户端界面,并将其命名为 IServiceClientExtended ;
  2. 在该界面中将 someXml 参数更改为 XmlCDataSection someXml ;
  3. MyFoo 方法属性中的
  4. XmlSerializerFormatAttribute.Use System.ServiceModel.OperationFormatUse更改为 System.ServiceModel.OperationFormatUse.Literal 。编码;
  5. 如果您尚未执行此操作,请从 IServiceClientExtended 属性中删除 GeneratedCodeAttribute ;
  6. 创建 ServiceClient 类(您可以从生成中复制它)并更改它实现的接口并继承到 ClientBase,IServiceClientExtended ;
  7. 创建所有必需的方法(或从生成中复制它)并更改方法签名以适应 IServiceClientExtended 接口( someXml 应该是 XmlCDataSection ,记得);
  8. 在您的代码中,使用您创建的 ServiceClient 类,将 someXml 参数转换为 XmlCDataSection 。你可以这样做:
  9. XmlDocument doc = new XmlDocument();
    var section = doc.CreateCDataSection(someXmlString);
    string result = client.MyFoo(param1, param2, param3, section);
    

答案 1 :(得分:1)

诉Kasparavičius是对的。但这很简单,只需在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>");