問題タブ [wcf-serialization]
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.
c# - WCF シリアル化の問題/例外をトレースする方法
(OperationContract から DataContract を返した後) WCF シリアル化中にアプリケーション例外がスローされるという問題が発生することがあります。私が受け取る唯一の(そしてあまり意味のない)メッセージは
System.ServiceModel.CommunicationException : 基になる接続が閉じられました: 接続が予期せず閉じられました。
内部例外への洞察がないため、シリアル化中にエラーの原因を突き止めるのが非常に困難になります。
これらの例外を追跡、ログ記録、およびデバッグする方法を知っている人はいますか? または、例外をキャッチして処理し、定義された FaulMessage をクライアントに送信できますか?
ありがとうございました
c# - XmlSerializer を使用した WCF: ジェネリック コントラクトを返すときの名前空間の衝突
背景
WCF を使用して C#.NET Web アプリケーション用の REST API を開発しています。XML 形式をより詳細に制御するために、デフォルトの DataContractSerializer ではなく XmlSerializer を使用するように構成しました。汎用ResponseContract<TResponse, TErrorCode>
データ コントラクトを作成しました。これは、要求ステータス、エラー メッセージ、名前空間などの汎用データを使用<Api>
して応答をラップします。<Response>
メソッドの例:
ResponseContract<ItemListContract, ItemListErrorCode> GetItemList(...)
上記のメソッドからの応答の例:
問題
これは、すべてのメソッドが同じジェネリック型を持つサービスに対して非常にうまく機能しますResponseContract
。WCF または、XmlSerializer
各コントラクトがその名前空間内で一意の名前を持つことを想定していますが、サービスは現在、同じ XML ルート名を持つさまざまな型の汎用コントラクトを返しています。
結果の例外で:
サービスは、さまざまな戻り値の型を許可する必要があります。ResponseContract<TResponse, TErrorCode>
(名前と名前空間を設定する) は一般的であり、すべての API メソッドによって返されるため、これを実現するのは困難です。また、 WSDL メタデータの整合性を維持する必要もあります。つまり、リフレクションを使用した動的な変更はありません。
試みられた解決策
<Api>
ルート要素とその属性は完全に汎用的であるため ( で) 、XML 属性を宣言的に変更することはできませんResponseContract
。リフレクションを使用して実行時に属性の名前空間を変更しても (たとえば、「http://example.com/api/Items/GetItemList」)、効果はありません。属性を取得することは可能ですが、属性を変更しても効果はありません。とにかく、これは WSDL を壊します。
IXmlSerializable を実装する場合、ライターはが呼び出された
<Api>
ときに既に開始タグの後に配置されています。の子ノードのWriteXml()
シリアライゼーションをオーバーライドすることだけが可能であり、いずれにしても問題はありません。メソッドが呼び出される<Api>
前に例外がスローされるため、これはとにかく機能しません。IXmlSerializable
typeof()
名前空間は定数でなければならないため、定数名前空間を一意にするために、または同様に連結しても機能しません。デフォルトで
DataContractSerializer
は名前に型名を挿入できますが ( のように<ApiOfIdeaList>
)、DataContractSerializer
の出力は肥大化して判読できず、属性が不足しているため、外部の再利用者には適していません。XmlRootAttribute
名前空間を別の方法で生成するように拡張します。残念ながら、呼び出されたときに利用できる型情報はなく、一般的なResponseContract
データのみです。この問題を回避するためにランダムな名前空間を生成することは可能ですが、スキーマを動的に変更すると WSDL メタデータが壊れます。ラッパー コントラクトの代わりに基本クラスを作成
ResponseContract
しても機能するはずですが、多くの汎用データが重複することになります。たとえば、上記の例では、<Pages>
and<Item>
もコントラクトであり、独自の同等の<Api>
and<Response>
要素があります。
結論
何か案は?
model-view-controller - MVCContribCustomPaginationWCFシリアル化
CustomPagination<T> (datasource, page number, page size, and total items count)
WCFサービスで取得するすべてのパラメーター。そこにあるCustomPaginationをWCFでインスタンス化して、アプリケーションに戻すことができれば素晴らしいと思います。[DataContract]
ただし、やなどの属性が欠落しているため、CustomPaginationオブジェクトをシリアル化できないよう[DataMember]
です。
CustomPaginationに必要なすべての値を個別に、または別のカスタムメイドのオブジェクトで返すことができることは知っていますが、すぐに使用できるCustomPaginationオブジェクトを1つだけ返す方がはるかに便利です。これに関する提案はありますか?
アプリケーションでサービス参照を更新しようとすると発生するエラー:
タイプ'MvcContrib.Pagination.CustomPagination`1[Myproject.WCFServices.DataContracts.User]'はシリアル化できません。
[DataContract]
Userオブジェクトは、適切な[DataMember]
属性でマークされています。
serialization - DataContractSerializer XML 出力で「d1p1」名前空間プレフィックスを削除します
DatacontractSerializer
domainModel を xml ファイルにシリアル化するために使用しています。以下のような出力が得られます。
そして、これらの「d1p1」名前空間プレフィックスを取り除き、の</PointDictionary>
代わりに like タグが必要です</d1p1:PointsDictionary>
。クラスのプロパティに DataMember 属性を配置しようとしましたが、問題の多くは解決しません。出力 XML ファイルはエンド ユーザーが編集できるため、上記の XML ファイルよりも見栄えの良い XML ファイルが必要です。
最優先事項は、コードのみで制御することです。それが不可能な場合は、XSLT またはその他のスキーマを使用します。
c# - WCF シリアル化例外 - NetDataContractSerializer
データのコレクションをサービスに送信しようとしているときにエラーが発生しました。ただし、コレクションにアイテムを 1 つだけ追加すると、問題なく動作します。複数のアイテムを追加するとすぐに、次のエラーが表示されます
タイプ 'SmartTrade.Shared.Common.PaymentTerm' を取得専用コレクションとして使用することは、NetDataContractSerializer ではサポートされていません。CollectionDataContractAttribute 属性または SerializableAttribute 属性で型をマークするか、プロパティにセッターを追加することを検討してください。
ここで重要なことは、コレクション (IList<>) を 1 つのアイテムで送信できることです。MaxReceivedMessageSize と MaxArrayLength を、妥当と思われる値まで増やしました。
誰でもここで私を助けてくれますか
wcf - WCF のメッセージが常に SOAP 形式に見えるのはなぜですか?
を実装して、WCF にメッセージ インスペクターを実装しIDispatchMessageInspector
ました。
このメソッドにブレークポイントを設定しています...
…request
オブジェクトを見て、中身を確認できます。
明らかに、私が使用するエンドポイント バインディング (basichttp、nettcp、および netpipe) が何であれ、内部のメッセージは常に SOAP 形式で表されるため、WCF を十分に理解していません。
これは、リクエスト オブジェクトで .ToString() を実行すると、単にメッセージが SOAP 形式で表されるためですか?
netTcp などの別のプロトコルを使用すると、別のメッセージ ペイロードが生成されると想像しました。
また、JSON 形式で自分のデータを表現したいとしましょう。これを行うにはどうすればよいでしょうか? それとも、SOAP エンベロープ内の JSON 形式のデータ構造になってしまうのでしょうか?
c# - WCF 転送オブジェクトをデフレート/シリアライズしたままにする
重複の可能性:
WCF メッセージの本文のみを取得する
おはよう、
複雑なオブジェクトを構築し、それを消費クライアントに送信する WCF サービスがあります。現在、サービスはうまく機能していますが、xml はクライアント上で再膨張/逆シリアル化されており、クライアントが XML を操作したいので、これは望ましくありません。
WCF サービス応答の一部として送信される「XML ドキュメント」を取得する方法はありますか。もちろん、クライアントで再度シリアル化することもできますが、回避できるのであれば、実際に追加の手順を実行する必要はありません。
ティアJB