4

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)を生成するフィールドをシリアル化する必要があるかどうかを呼び出し側に示すことができます(hereherehereと記載されています)。この場合、以下のように

は、しかし、パラメータが参照されている:私は手動で適切な方法をfieldNameSpecified追加しようとすると

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://vendorservicenamespace.com/", Order=23)] 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public Namespace.parameterName parameterName; 

、任意のシリアル化には影響していないようです(つまり、パラメータはまだソープメッセージに表示されています)。この時点で

は、私が

  1. なぜfieldNameSpecifiedパラメータを含むsvcutilされていないことを疑問に思って?
  2. 手動でパラメータを追加しないのはなぜですか?
  3. 他にもこの問題の回避策がありますか?

EDIT:より一層の研究の後、私は問題の一部は、WSDLが書かれている方法であると判断しました。ベンダーのWSDLは、DataContractSerializerのSchema Referenceに準拠していません。このため、svcutilはXmlSerializerにフェイルバックしています。

問題は、メソッドのメッセージコントラクトはまだ生成していますが、データコントラクトは生成していないことです。これは、メッセージから除外することができないという点で、デフォルトでヌル入力可能でないタイプの場合に問題となります(誰でもこれを確認できますか?)。理由が何であれのXmlSerializerのためparameterNameSpecifiedメソッドは、パラメータがMessageBodyMemberAttribute(わからない、なぜ?)

私はこの動作を回避することができた唯一の方法は/wrappedオプションを使用しているとフラグが立てられたときに無視されるように表示されますsvcutilと一緒に。この結果、メッセージ契約は実際のセラー化パラメータ自体から分離されます。この場合、svcutil パラメータ名指定メソッドを生成し、XmlSerializerがそれに従います。

+0

プロパティはどのように見えますか?それは 'parameterName'型か' Nullable '型ですか? –

+0

これはparameterNameとして生成されます。 WSDLは、パラメータが "nullable"(nillable = true)であることを明示的に指定していないため、「オプション」は使用するのに適した用語でした。 –

+0

解決策が見つかった場合は、それを回答として追加し、回答を受け入れます。 –

答えて

3

問題を調査した後、私が見つけた唯一の解決策は、svcutilの/ wrappedオプションを使用してプロキシを生成することです。上記で参照したように、抽象レイヤーが追加され、メッセージコントラクトがパラメータの上にレイヤーとして存在することができます。この場合、XmlSerializerはfieldNameSpecifiedプロパティを生成し、それらに準拠します。

関連する問題