に無効な列挙値を無視します。新しい値が追加され、その値が関数呼び出しによって返された場合、Webサービスのコンシューマは、そのenum値を気にしなくても例外をスローします。は、私が列挙型の配列を返すASP.NETのWebサービスのWebMethod属性を持つSOAPデシリアライズ
[WebMethod]
public UserRole[] GetRoles(string token)
部分のwsdl:
<s:simpleType name="UserRole">
<s:restriction base="s:string">
<s:enumeration value="Debug" />
<s:enumeration value="EventEditor" />
<s:enumeration value="InvoiceEntry" />
</s:restriction>
</s:simpleType>
(消費者は、このWSDLを使用してコンパイルされたが、その後、WSDLの変更、新しい値が現在許可されている - その値が返された場合、XML例外がでスローされますクライアント。)
私は、エラーをキャッチし、いずれかの配列からその項目を削除するか、またはデフォルト値に置き換えることができるように、このタイプのSOAPの直列化復元を無効にする方法はありますか?これがXMLの代わりにJSONを使用していた場合、そのタイプを処理するためにJsonConverterを登録することができます。同様のグローバルな "RegisterConverter"タイプの関数を探しています。私は存在しないと思っていますが、いくつかの助けを期待しています...
すべてのコードはwsdlによって生成され、Web参照が更新されると再生成されるため、属性付きEnumをデコレートする手段はありません。通常、wsdlによって生成されたクラスを変更したい場合は、部分クラスを作成できますが、Enumでは機能しません。そして、それがクラスであってもXmlSerializationコードをオーバーライドできるかどうかは確かではありません。
いくつかの追加の背景:
これは実際には、動的列挙型での私の試みとして実装されています。 wsdlはデータベースルックアップから生成され、データベースに余分な値を追加することができます。消費するアプリケーションは、Webサービスを再コンパイルせずに許容値にアクセスできます。このようにして、私はintellisenseとenum型の制約強制を得るが、Webサービスコードとクライアントコードを緊密に結合することなく値を追加することができる。問題は、新しい値を追加すると、新しいwsdlで更新されていない消費者を壊す可能性が生じるということです。消費者は何をするべきか分からないので、その値を無視するだけですとにかくそれです。
SOAP拡張機能はこれを修正する方法です(SOAP拡張機能をWebService自体に追加する方法は分かっていますが、クライアント側にSOAP拡張機能を追加する方法はわかりません)。しかし、私は本当にこれを簡単に処理する一般的な方法を持っているので、私は自分のコードでより動的な列挙型を持つことができます(実際には動的ではありませんが、値はWebサービスの中間層を通過する必要はありませんその中間層を再コンパイルする)。
さて、2つの解決策が考えられました。 1つは、WebService宣言(一部のクラス内)でGetReaderForMessageをオーバーライドしてから、列挙型の名前と値をRegexで照合し、もう1つは受け入れ可能な値のリストをwebserviceまで送信し、webserviceを送信を拒否させることですそのリストにない値。それらの両方は吸う、と私は誰かが私がこれまで持っているものよりも良い答えを思い付くことを望んでいる。そうでなければ、私は明日自分のジャンキーの回答を投稿します。 –
さて、私はGetReaderForMessageをオーバーライドしてしまいましたが、enum名のメッセージ文字列全体にマッチするRegexよりも若干優れていました...さらに、enumの逆シリアル化をオーバーライドするより良い方法が望まれます。 –
WSDLとXSDの全体のポイントは、サービスとクライアントの間で契約を結ぶことです。この契約を破るために何かを実装しています。別の実装を再考するべきではありませんか?または、enumの代わりに何かを許可するようにWSDLを変更します。 –