を保持は、私は私のサービスが受け入れて、実際にそれらのタイプがどうなるか知らなくてもBaseType
から派生型を返すことができるようにしたいです。私はほとんどSharedTypeResolver from this excellent blog postに基づいてカスタムDataContractResolver
を使用してソリューションを持っています。デシリアライズ誘導基の種類としてWCFサービス内の型が、型情報
パズルの欠けている部分は、サービスが処理するタイプがサービスと共有されていない可能性がありますが、それを受け入れて、そのタイプがどうあるべきかを認識したいということです。私はスタックとして機能する次のサービスの例を思いつきました。あなたはSharedTypeResolver
を使用して、種類がクライアントとサーバの間で共有されてBaseType
由来いずれかのタイプをプッシュして開くことができます。
[DataContract]
public class BaseType
{
[DataMember]
public string SomeText { get; set; }
public override string ToString()
{
return this.GetType().Name + ": " + this.SomeText;
}
}
[DataContract]
public class DerivedType : BaseType
{
[DataMember]
public int SomeNumber { get; set; }
public override string ToString()
{
return base.ToString() + ", " + this.SomeNumber;
}
}
[ServiceContract]
public interface ITypeStack
{
[OperationContract]
void Push(BaseType item);
[OperationContract]
BaseType Pop();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class TypeStackService : ITypeStack
{
private Stack<BaseType> stack = new Stack<BaseType>();
public void Push(BaseType item)
{
this.stack.Push(item);
}
public BaseType Pop()
{
return this.stack.Pop();
}
}
これは明らかに私が抱えている問題の非常に単純化された例です。クライアントはかなり陽気にプッシュし、クライアントとサーバーの両方がそれらについて知っているのでBaseType
またはDerivedType
をポップが、クライアントがサービスを知らないUnsharedType
を押した場合、私はあなたが期待するようなエラーを取得することができます。 メッセージをデシリアライズしようとしているときに
フォーマッタが例外をスローしました:パラメータ http://tempuri.org/:itemをデシリアライズしようとしているときにエラーが発生しました。 'http://tempuri.org/:item'要素には、 'TestWcfClient、Version = 1.0.0.0、 Culture = neutral、PublicKeyToken = null:TestWcfClient.UnsharedType'という名前にマップされたタイプのデータ が含まれています。 。 デシリアライザは、この名前にマップの任意のタイプの知識を持ちません。 DataContractResolverのResolveNameメソッドの実装を、 'TestWcfClient.UnsharedType'および名前空間 'TestWcfClient、 Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'のnull以外の値を返すように変更することを検討してください。 。詳細については、 InnerExceptionを参照してください。
私の現在の考え方は、非共有タイプの値を保持し、非共有タイプは、アイテムがプッシュされ、デシリアライゼーション上のサービスへBaseType
のように見えるようにBaseType
にIExtensibleDataObject
を追加することです。アイテムがポップされたときには、その逆が発生する必要があります。私はそれについてどうやって行くのか分かりません。アイテムが押されたときにサービスが受けシリアル化されたXMLを保持どういうわけか、非共有タイプの代わりにIDataContractSurrogate
を使用してTypeDelegator
DataContractResolver
へ
- さらにカスタマイズ:これまでのアプローチに私の考えアイテムが
- ポップされたとき、その後、メッセージを操作するメッセージ・インスペクタを使用して応答でこれを使用
これらのいずれかがうまくいくかどうか、何が関係するのか、何が最善の解決策なのかはわかりません。あなたは?
サービス上のオブジェクトを変更するのか、それともそれらを保存してクライアントに返すだけですか? – Enes
保存して送り返してください。私は、サービスがストレージに影響を与えるために使用するいくつかのプロパティを持っているとして、基本型について知っておく必要がありますが、それは読み取り専用です限りのサービスを懸念しています。 – batwad