WCF Soap サービスのメソッドを呼び出すと、エラーがスローされ、svlog ファイルに次のエラーが表示されます。
タイプ 'xxx.ActiveDirectoryService.classes.WCF.Message' データ コントラクト名 'Message: http://schemas.datacontract.org/2004/07/xxx.ActiveDirectoryService.classes.WCF ' は想定されていません。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。
あちこちで KnownType を使用しようとしましたが、成功しませんでした (その使用法が 100% 正しいかどうか確信が持てないことを認めなければなりません)。
ここに私のインターフェイス/クラスがあります:
[ServiceContract]
public interface IActiveDirectory
{
[OperationContract]
[WebGet]
void Dummy();
[OperationContract]
[WebGet]
AbstractMessage Dummy2();
[OperationContract]
[WebGet]
AbstractMessage Dummy3();
[OperationContract]
[WebGet]
AbstractMessage SetPassWord(string customer, string customerPassword, string userLogin, string userPassword);
}
[DataContract]
public abstract class AbstractMessage
{
[DataMember]
public virtual bool IsError { get; set; }
[DataMember]
public virtual string ErrorMessage { get; set; }
[DataMember]
public virtual string ReturnValue { get; set; }
}
public class Message : AbstractMessage
{
<...>
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
[KnownType(typeof(AbstractMessage))]
public class ActiveDirectory : IActiveDirectory
{
public void Dummy()
{
}
public AbstractMessage Dummy2()
{
return new AbstractMessage();
}
public AbstractMessage Dummy3()
{
return new Message();
}
public AbstractMessage SetPassWord(string customer, string customerPassword, string userLogin, string userPassword)
{
<...>
return message; // message is of type Message
}
}
編集: 12AM35 GMT+1
Dummy() メソッドを追加しました。
- クライアントからのダミーの呼び出しは正常に機能します。
- クライアントから Dummy2 を呼び出すと正常に動作します。
- クライアントから Dummy3 を呼び出すと、同じエラーが発生します。
編集 12AM39 GMT+1
次の変更を加えても役に立ちませんでした。
[DataContract]
[KnownType(typeof(AbstractMessage))]
public class Message : AbstractMessage
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
[KnownType(typeof(AbstractMessage))]
[KnownType(typeof(Message))]
public class ActiveDirectory : IActiveDirectory
編集: 13AM31 GMT+1
Dummy3 の戻り値の型を Message に設定すると、クライアント コードでの Dummy3 の呼び出しが機能します。
WCF + ポリモーフィズムには奇妙な点があります...