我们正在使用一个使用XmlSchemaProviderAttribute的自定义类,以使其看起来像一个字符串。声明如下:
[XmlSchemaProvider("GetSchema")]
public sealed class CDataWrapper : IXmlSerializable
{
public static XmlQualifiedName GetSchema(XmlSchemaSet xs)
{
return XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).QualifiedName;
}
// implicit to/from string
public static implicit operator string(CDataWrapper value)
{
return value == null ? null : value.Value;
}
public static implicit operator CDataWrapper(string value)
{
return value == null
? null
: new CDataWrapper
{
Value =
value
};
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
// "" => <Node/>
// "Foo" => <Node><![CDATA[Foo]]></Node>
public void WriteXml(XmlWriter writer)
{
if (!string.IsNullOrEmpty(Value))
{
writer.WriteCData(Value);
}
}
// <Node/> => ""
// <Node></Node> => ""
// <Node>Foo</Node> => "Foo"
// <Node><![CDATA[Foo]]></Node> => "Foo"
public void ReadXml(XmlReader reader)
{
if (reader.IsEmptyElement)
{
Value = "";
}
else
{
reader.Read();
switch (reader.NodeType)
{
case XmlNodeType.EndElement:
Value = ""; // empty after all...
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:
Value = reader.ReadContentAsString();
break;
default:
throw new InvalidOperationException("Expected text or CData but was: "+ reader.NodeType);
}
}
}
// underlying value
public string Value { get; set; }
public override string ToString()
{
return Value;
}
}
CDataWrapper类被from this question。我们正在使用它,因为我们的一个客户端(FLEX客户端)无法正确读取前导\尾随空格。我们让它看起来像架构中的字符串,以免与我们的其他客户断开合同。这通常很好用,但是我们的一个客户端无法使用WCF为使用上述包装类的服务创建的模式生成代理。我们在wsdl中找到了这一行的原因:
<xsd:import schemaLocation="http://my.services.com/service/mex?xsd=xsd4" />
其内容是:
<?xml version="1.0" encoding="utf-8" ?>
- <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="string" nillable="true" type="xs:string" />
</xs:schema>
问题是上面的xsd:import元素上没有namespace属性,而且我们客户端的代理生成器无法很好地处理。
简而言之,我们如何将namespace属性添加到生成的wsdl?
答案 0 :(得分:1)
此信息是(正常)冗余,因为导入的xsd的targetnamespace也在此XSD中定义:
<xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/XMLSchema">
如果无法修改代理生成器,是否可以选择预处理主wsdl并在主wsdl中插入targetnamspace?
如果这不是一个选项,article可能对您有帮助。
如果这仍然不是解决方案,您可以尝试将wsdl全部展开并使用此WSDLFlattener删除xsd:imports