メッセージ ヘッダーのシリアル化に関する WCF の問題
-
19-09-2019 - |
質問
次のコードがあります。
public virtual void Initialise()
{
this.AddHeader("SystemContext", this.UserSettings.SystemContext);
}
public virtual void AddHeader(string key, object value)
{
var customHeader = MessageHeader.CreateHeader(key, this.SystemSettings.SystemServiceNamespace, value);
OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);
}
上記のコードを実行した後にサーバーを実行しようとすると、次のエラーが発生します。
データ コントラクト名「UserAcountDetials:」を使用して「ACSIS.Core.Common.Configuration.UserAcountDetials」と入力します。http://schemas.datacontract.org/2004/07/ACSIS.Core.Common.Configuration' は期待されていません。静的に知られていないタイプを既知のタイプのリストに追加します。たとえば、
KnownTypeAttribute
属性を使用するか、DataContractSerializer に渡される既知の型のリストに追加します。
今 UserSettings
説明します SystemContext
タイプとして IDictionary
. 。WCF では何もないところから魔法のようにオブジェクトを作成できないことは理解しているので、それを少し手助けする必要があります。
オブジェクトのランタイム型をネットワーク経由で渡し、反対側でその型に変換する方法はありますか。私は Java から .net SOA への変換などに WCF を使用していません。具象型がワイヤーの反対側にあることはわかっています。
WCF が実際にはこれをサポートしていない場合 (ただし、何らかの方法があるはずです)、データをバイナリ形式にシリアル化し、そのバイナリをヘッダーに添付し、渡す型情報を使用して自分でシリアル化を処理する方法はありますか。
解決
次のように、knownType 属性をサービス コントラクトに適用してみることができます。
[ServiceKnownType(typeof(ACSIS.Core.Common.Configuration.UserAcountDetials))]
[ServiceContract]
public interface IMyService
{...
はい、それほどエレガントではありませんが、BinaryFormatter を使用してヘッダー オブジェクトを byte[] 配列にシリアル化し、それをヘッダーに貼り付けてから、反対側で逆シリアル化することもできます。バイナリ シリアル化はバージョン管理に関して注意が必要なため、少し注意する必要があります。