そのため、WCF から生成された WSDL と XSD をフォーマットする方法、具体的には WSDL と XSD に注釈/ドキュメントを追加し、さまざまなパラメーターに制限を追加する方法について調査しています。
これまでのところ、IOperationBehavior インターフェイスとともに IWSDLExportExtension インターフェイスを実装する属性を作成することで、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");