Java(私はApache Axisと思われます)に実装されている外部ベンダーのWebサービスを使用しています.WCFクライアントで使用しています。いくつかの操作では、列挙型の入力パラメーターが必要です。問題は、特定のケースで列挙型が渡されるだけであることです。要素はWSDLでnillableとしてマークされていません。ただし、それらは列挙型なので、指定されていない場合でも、WCFクライアントは常にデフォルト値を渡します。この動作により、サービスで内部エラーが発生しています。WCFクライアントでの列挙のオプション
この問題に対処する方法についてのご意見はありますか?プロキシの手動修正を必要としないソリューションであることが好ましい。これは、別の開発者が将来独立してそれを生成する場合に混乱を招く可能性があるからである。
次のように特定の要素がSvcutilが
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://vendorwebservicenamespace.com/")]
public enum parameterName
{
/// <remarks/>
ONLY_AVAILABLE_VALUE,
}
EDITとしてこれを翻訳する
<xs:complexType name="complexTypeName">
<xs:sequence>
<!-- More Stuff Here-->
<xs:element minOccurs="0" name="parameterName" type="tns:parameterName" />
<!-- More Stuff Here-->
</xs:sequence>
</xs:complexType>
<!-- . . . -->
<xs:simpleType name="parameterName">
<xs:restriction base="xs:string">
<xs:enumeration value="ONLY_AVAILABLE_VALUE" />
</xs:restriction>
</xs:simpleType>
WSDLで指定されていますもう少し研究した後、それはsvcutilのように見えるはずです正常に追加のbool
フィールド名指定のを含むオプションパラメータ(minOccurs = 0)を生成するフィールドをシリアル化する必要があるかどうかを呼び出し側に示すことができます(here、here、hereと記載されています)。この場合、以下のように
は、しかし、パラメータが参照されている:私は手動で適切なが方法をfieldNameSpecified追加しようとすると
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://vendorservicenamespace.com/", Order=23)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public Namespace.parameterName parameterName;
、任意のシリアル化には影響していないようです(つまり、パラメータはまだソープメッセージに表示されています)。この時点で
は、私が
- なぜfieldNameSpecifiedパラメータを含むsvcutilされていないことを疑問に思って?
- 手動でパラメータを追加しないのはなぜですか?
- 他にもこの問題の回避策がありますか?
EDIT:より一層の研究の後、私は問題の一部は、WSDLが書かれている方法であると判断しました。ベンダーのWSDLは、DataContractSerializerのSchema Referenceに準拠していません。このため、svcutilはXmlSerializerにフェイルバックしています。
問題は、メソッドのメッセージコントラクトはまだ生成していますが、データコントラクトは生成していないことです。これは、メッセージから除外することができないという点で、デフォルトでヌル入力可能でないタイプの場合に問題となります(誰でもこれを確認できますか?)。理由が何であれのXmlSerializerのためparameterNameSpecifiedメソッドは、パラメータがMessageBodyMemberAttribute
(わからない、なぜ?)
私はこの動作を回避することができた唯一の方法は/wrapped
オプションを使用しているとフラグが立てられたときに無視されるように表示されますsvcutilと一緒に。この結果、メッセージ契約は実際のセラー化パラメータ自体から分離されます。この場合、svcutil はがパラメータ名指定メソッドを生成し、XmlSerializerがそれに従います。
プロパティはどのように見えますか?それは 'parameterName'型か' Nullable '型ですか? –
これはparameterNameとして生成されます。 WSDLは、パラメータが "nullable"(nillable = true)であることを明示的に指定していないため、「オプション」は使用するのに適した用語でした。 –
解決策が見つかった場合は、それを回答として追加し、回答を受け入れます。 –