問題タブ [messagecontract]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wcf - WCF の MessageContract の KnownType
wcf コントラクト内でオブジェクトを使用Stream
しているため、MessageContract
代わりに使用する必要がありDataContract
ます。
このサービスのコンシューマーに、A または B のいずれかのオブジェクトを作成し、それを使用してサービスを呼び出してもらいたいと考えています。サービス側では、それを適切なオブジェクトに型キャストしてから、何らかのアクションを実行できます。
問題は、サービスで使用されるか、で宣言されるまで、で指定できずKnownType
、MessageContract
継承されたコントラクトをクライアントに公開できないことKnownType
です。
グーグルで検索してみましたが、に関連するものは見つかりませんでしKnownType
たMessageContract
。
コメントで提案されているように...メッセージコントラクトを更新しましKnownType
たが、サービス参照を通じてクライアントに公開されていません...
ここで何が問題なのか、誰でも助けてくれますか?
注:ALLKnownType
はから継承されていますDocument
c# - 同じクラスで MessageContract と CollectionDataContract の両方を使用するには?
Web サービス用に次のコードがあります。
このサービスは、次の SOAP リクエストを受け入れます。
ただし、次の SOAP リクエストを受け入れる必要があります (「CustomStrings」タグなし)。
MessageContract を使用しない場合は、次のようになります。
私が望むものに近い、次の XML を実現できます。
しかし、「GetStringCollection」タグが存在し、これを MessageContract が削除するのに役立ちます。
したがって、MessageContract と CollectionDataContract の両方が必要ですが、次のようにすると:
例外があります:
「例外の詳細: System.InvalidOperationException: タイプ WcfService1.StringCollection は MessageContract を定義しますが、MessageContract を定義しないタイプ System.Collections.Generic.List`1[System.String] からも派生します。ÿ継承内のすべてのオブジェクトWcfService1.StringCollection の階層は、MessageContract を定義する必要があります。"
問題は、最上位クラスで MessageContract と CollectionDataContract の両方を使用する方法はありますか? そうでない場合、どうすれば希望のリクエストを受け入れることができますか?
c# - WCF MessageHeader 属性が逆シリアル化されない
WCF で SOAP ベースの Web サービスを開発しています。
私のクライアントは、次の SOAP 要求 xml を使用して WCF サービスに要求を送信します。
MessageContract
クライアントに値を渡すか、クライアントから値を取得するクラスを作成しました。
MessageContract
クラスには複数の属性MessageHeader
プロパティがありますが、リクエストがサーバーに送信されると、属性を持つプロパティは逆シリアルMessageHeader
化されず、常にnullです。
RequestHead
タグには prefix があり、me
WCF サービスでオブジェクトへの XML 要求を逆シリアル化するために問題が発生すると思います
ただし、RequestBody
タグにはプレフィックスもありますm
が、正常に逆シリアル化されます。
タグme
からプレフィックスを削除すると、正常に機能しました。属性プロパティRequestHead
の値を取得しました。MessageHeader
私のクラス:
そして、WCF サービスでの私のアクション メソッドは次のようになります。
次のコードを使用してリクエスト SOAP XML を確認したとき:
ヘッダー値を含む完全なリクエストSOAP XMLも提供しますが、オブジェクトにデシリアライズしません。
どこが間違っているのか、何かが欠けているのかわかりません。
同じ質問がありますが、今のところ回答がありません: WCF でカスタム SOAP ヘッダーを逆シリアル化するにはどうすればよいですか?
手伝ってくれてありがとう...
xml - WCF MessageContract 複合型プロパティが逆シリアル化されない
この SOAP メッセージを処理するサービスを実装する必要があります。
メッセージ コントラクトは現在次のようになっています。
文字列プロパティoperationParam
は、サービスによって正しく解析されます。しかし、私が何をしても、「複合型」operationHeader
を機能させることはできません。
上記のコードでは、との宣言に関係なく、 のプロパティOperationHeader
は常に nullです。XmlType
XmlElement
XMLタイプを匿名として装飾しOperationHeader
、属性を持たないクラスのバリエーションを試しました。クラスMessageBodyMember
のすべてのメンバーでまだ nullです。OperationHeader
非常に奇妙なことは、代わりにこれを行うと:
次に、解析される XML 要素はoperationHeader
それ自体ではなく、XML の最初の子要素です。headerParamA
.
私のクラスがどのように見えるべきか知っている人はいますか?
この回答とまったく同じように実行しようとしましたが、複合型のメンバー プロパティに対しても null のみが返されます。
それとも、送信された XML が壊れているのでしょうか?
c# - MessageContractをWCFの順序にとらわれないようにする方法は?
MessageContracts を使用する WCF サービスがあります。頭を悩ませているのは、メッセージ内の要素の順序が変更されると、サービスがその要素を無視することです。以下に例を示します (関係のない詳細は削除されています)。
それはうまくいきます。しかし、代わりに私が送信した場合
Bananas の値は無視され、NULL として返されます。私の MessageContract クラスは次のようになります。
また、DataContractSerializer を使用していることにも言及する必要があります。ここでの例は単純な文字列ですが、実際のメッセージ オブジェクトははるかに複雑で、リストと DataContract オブジェクトが含まれています。
WCF はデフォルトでメンバーをアルファベット順に並べているようです。正直なところ、どの順序が使用されているかさえ気にしません。私が望むのは、消費者がこれらの値を好きな順序で渡して、サービスを引き続き機能させることができるようにすることです。XMLは順序が指定されていなくても読みやすいので、これは実行できそうです。
シリアライザーを変更したり、MessageContract から DataContract に変更したりしたくないことに注意してください。これは、実稼働環境の既存のサービスであり、WSDL が既存のコードと互換性がなくなるような変更を行うことはできません。これらの MessageContract を DataContract に変更して遊んだところ、WSDL の構造が変更され、既存のコードと互換性がなくなりました。
c# - WCF: メッセージ コントラクトを返す操作に値型パラメーターを渡す
状況:
私はこのサービス契約を持っています:
この場合、Group にはメッセージ コントラクトがあり、このメッセージ コントラクトはサービス コントラクトからセキュリティ レベルを継承します。グループは次のようになります。
GUIDWRAPPER 型は Guid の単純なラッパーであり、メッセージ コントラクトもあります。
問題:
サービス ホストを起動すると、戻り値の型「Group」にはメッセージ コントラクトがあり、値の型「int」には含まれていないため、操作「GetB」が無効であると不平を言います。これはセキュリティ上の欠陥の可能性があります。
戻り値の型とパラメーターの型の両方にメッセージ コントラクトがあるため、"GetA" は問題ありません。
可能な解決策:
1.) GUIDWRAPPER クラスで行ったように、すべての値の型をラップし、それらにメッセージ コントラクトを与えることができます。しかし、それは私には汚くて臭いと感じます。
2.) すべてのメッセージ コントラクトを削除し、データ コントラクトのみを使用します。次に、どのデータが送受信されるかを制御できなくなります。
私の質問:
メッセージ コントラクトの戻り値の型を持つサービス操作に単純な値の型 (この場合は int など) を渡すことは可能ですか? (この場合は GetB のように)
それを許可する操作コントラクトの属性はありますか?