因此,我正在研究如何格式化从 WCF 生成的 WSDL 和 XSD,特别是向 WSDL 和 XSD 添加注释/文档以及对各种参数添加限制。
到目前为止,我已经能够通过创建实现 IWSDLExportExtension 接口和 IOperationBehavior 接口的属性来将文档添加到 WSDL 和 XSD。
有关修改模式的总体思路,请参见:
http ://thorarin.net/blog/post/2010/08/08/Controlling-WSDL-minOccurs-with-WCF.aspx
有关向 WSDL 添加注释的总体思路,请参见:http:
//msdn.microsoft.com/en-us/library/ms731731 (v=vs.110).aspx
但是,当我尝试在 xsd 中向元素添加限制(通过添加简单类型)时遇到了麻烦。
从这里我可以得到一个异常,说明我不能设置元素类型,因为它已经有一个与之关联的只读类型,或者我可以尝试使用只读类型来添加限制,但是没发生什么事。
这是生成异常的代码
(System.Xml.Schema.XmlSchemaException: The type attribute cannot be present with either simpleType or complexType.)
:
var ComplexType = ((XmlSchemaElement)Schema.Elements[Parameter.XmlQualifiedName]).ElementSchemaType as XmlSchemaComplexType;
var Sequence = ComplexType.Particle as XmlSchemaSequence;
foreach (XmlSchemaElement Item in Sequence.Items)
{
if (Item.Name = Parameter.Name && Parameter.Length > 0)
{
XmlSchemaSimpleType tempType = new XmlSchemaSimpleType();
XmlSchemaSimpleTypeRestriction tempRestriction = new XmlSchemaSimpleTypeRestriction();
XmlSchemaLengthFacet lengthFacet = new XmlSchemaLengthFacet();
tempType.Content = tempRestriction;
tempRestriction.Facets.Add(lengthFacet);
lengthFacet.Value = "" + Parameter.Length;
Item.SchemaType = tempType; // <-- Problem code
}
...
}
这是什么都不做的解决方法:
var ComplexType = ((XmlSchemaElement)Schema.Elements[Parameter.XmlQualifiedName]).ElementSchemaType as XmlSchemaComplexType;
var Sequence = ComplexType.Particle as XmlSchemaSequence;
foreach (XmlSchemaElement Item in Sequence.Items)
{
if (Item.Name = Parameter.Name && Parameter.Length > 0)
{
XmlSchemaSimpleTypeRestriction tempRestriction = new XmlSchemaSimpleTypeRestriction();
XmlSchemaLengthFacet lengthFacet = new XmlSchemaLengthFacet();
tempRestriction.BaseTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");
tempRestriction.Facets.Add(lengthFacet);
lengthFacet.Value = "" + Parameter.Length;
// Appears to do nothing
((XmlSchemaSimpleType)Item.ElementSchemaType).Content = tempRestriction;
}
...
}
快速的其他注意事项:如果我切换到正常的 for 循环并实际上尝试用新元素替换麻烦元素(我知道是骇人听闻的......),我会得到以下异常:System.InvalidCastException: Unable to cast object of type 'System.Xml.Schema.XmlSchemaSimpleType' to type 'System.Xml.Schema.XmlSchemaParticle'.
这个我只是好奇,因为他们两者都应该是 XmlSchemaElements 对吗?
所以基本上,有谁知道如何向 xmlschemaelements 添加简单类型/添加简单类型限制并将其显示在使用 WCF 的 WSDL 生成的 XSD 中?
谢谢!
编辑:添加
tempRestriction.BaseTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");