5

我正在尝试将应用程序与第三方 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# 转义(正如我所期望的那样)所有必须转义的字符,主要是“<”和“>”字符,甚至在 CDATA 语句中,结果如下:

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

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

有谁知道我是否错过了什么,不知道什么,或者这是正确的并且无法满足第三方网络服务的期望?

谢谢。

4

2 回答 2

1

V. Kasparavičius is right. But it is much simple, this just needs a little change in Reference.cs. The type of the parameter needs to be changed from string to XmlCDataSection.

private XmlCDataSection foo;

[System.Xml.Serialization.XmlElementAttribute(Order=2)]
public XmlCDataSection foo {
    get {
        return this.foo;
    }
    set {
        this.foo = value;
        this.RaisePropertyChanged("foo");
    }
}

And then add the parameter as XmlCDataSection

var xmlDocument = new XmlDocument(); var parameter = xmlDocument.CreateCDataSection("<foo></foo>");

于 2015-03-27T17:56:30.430 回答
1

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

简单快速的食谱:

  1. 复制生成的服务客户端接口并将其命名为IServiceClientExtended
  2. 在该界面中将 someXml参数更改为XmlCDataSection someXml
  3. MyFoo方法属性中将XmlSerializerFormatAttribute.Use更改为System.ServiceModel.OperationFormatUse.LiteralSystem.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);
于 2013-08-13T06:23:53.233 回答