これを行ったところ、KnownTypesAttribute をインターフェイスに追加する必要があることがわかりました。
[ServiceContract]
[ServiceKnownType(typeof(MyContract1)]
[ServiceKnownType(typeof(MyContract2)]
[ServiceKnownType(typeof(MyContract3)]
public interface IMyService
{
[OperationContract]
object TakeMessage();
[OperationContract]
void AddMessage(object contract);
}
実装では、タイプをチェックして、それが DataContracts の 1 つであることを確認する必要があります。
編集
コントラクトが多数ある場合は、リフレクションを使用してそれらを KnownTypes に追加できます。
internal static class KnownTypeHelper
{
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider = null)
{
var types = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.Namespace == "Company.Path.To.DataContractsNamespace").ToArray();
return types;
}
}
次に、インターフェイスを次のように宣言できます。
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))]
public interface IMyService
{
[OperationContract]
object TakeMessage( );
[OperationContract]
void AddMessage(object contract);
}
これは、はるかにクリーンな方法です。