Когда я вызываю метод моей WCF службы Soap, выдается ошибка и появляется сообщение об ошибке в файле svlog:Проблемы WCF с типами?
Тип «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
}
}
Edit: метод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
Edit:13AM31 GMT+1
Если установить Dummy3 тип возвращаемого на сообщение, вызовы Dummy3 в коде клиента работы.
Есть что-то странное с WCF + Полиморфизм ...
[KnownType (typeof (Message))] отлично работает, но мне пришлось обновить ссылки моего клиента (чего я не делал до нескольких минут назад). – Serge