WCFを使用していくつかのWebサービスに接続しようとしていますが、必要な関数を呼び出そうとするとエラーが発生します。それも実際のサービスを呼び出すに取得し、方法を私がしようとしているので、それも発生していない前にSystem.InvalidOperationException:XmlSerializer属性System.Xml.Serialization.XmlChoiceIdentifierAttributeが無効です。
System.InvalidOperationException : XmlSerializer attribute System.Xml.Serialization.XmlChoiceIdentifierAttribute is not valid in Item. Only XmlElement, XmlArray, XmlArrayItem, XmlAnyAttribute and XmlAnyElement attributes are supported when IsWrapped is true.
エラーが発生:
この
は私が取得していますエラーですコール。この問題は、WCF生成クラスで定義されている別のメソッドで発生します。 私はWSDLを定義するために使用されるXSD内のコードのセクションに問題をトレースすることができました:
<xs:choice minOccurs="0">
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType"/>
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType"/>
</xs:choice>
対応する生成されたコード:私はコメント
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(Namespace="http:integration.sprint.com/interfaces/manageSubscriberServices/v1/manageSubscr" +
"iberServices.xsd", IncludeInSchema=false)]
public enum ItemChoiceType2
{
additionalSocInd,
skipServiceValidationInd,
}
上記の列挙型とそのすべての参照を除いて、サービスは動作します。 XSDには、問題を引き起こさないようなxs:choice文があります。
更新: さらなる調査では、次のを持っているときことを明らかにした:
要素は、配列要素の内部で直接定義されます。
<xs:sequence>
<xs:element ... />
...
<xs:choice minOccurs="0">
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType" />
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType" />
</xs:choice>
...
<xs:element ... />
</xs:sequence>
svcutilによって生成されたプロキシは、エラーが発生します上で述べた。
<xs:sequence>
<xs:element ... />
...
<xs:element minOccurs="0" name="myChoiceType" type="tns:MyChoiceType" />
...
<xs:element ... />
</xs:sequence>
<xs:complexType name="MyChoiceType">
<xs:choice>
<xs:element name="additionalSocInd" type="tns:BinaryExpressionType" />
<xs:element name="skipServiceValidationInd" type="tns:BinaryExpressionType" />
</xs:choice>
</xs:complexType>
エラーが消える:このように見えるように変更さ
。だから、ジェネレータ(svcutil)が生成するコードのバグかもしれません。
私は、WSDLのすべてのメソッドを呼び出す必要があるので、動作しないものをコメントアウトすることはオプションではありませんでしょう。 WSDL(クライアントではなく、私たちのもの)を変更せずに動作させる必要があります。どんな助けもありがとう。
あなたはWSDLを変更することはできませんとSvcUtilが正しくそのWSDLにそのXSDを解析しないことを考えると、それはあなたの唯一の現実的な選択肢と思われます編集したバージョンのWSDLをSvcUtilに渡してクライアントコードを作成します。そのクライアントコードがサービスで正しく機能する場合は、WSDLが変更されるたびに同じ手動プロセスを実行する必要があります。私の推測は、SvcUtil XSD解析ロジックよりもクライアントのWSDLのXSDに "バグ"が存在する場合です。 –
"WCF&C# - "をタイトルに追加しないでください。タグはすでに質問を分類しています。 –