Kiedy wywołać metodę mojego WCF usługi mydło, zostanie zgłoszony błąd i pojawia się błąd w pliku svlog:Problemy WCF z typami?
Type „xxx.ActiveDirectoryService.classes.WCF.Message” z nazwą zamówienia dane „Wiadomość : http://schemas.datacontract.org/2004/07/xxx.ActiveDirectoryService.classes.WCF "nie oczekuje się. Rozważ użycie DataContractResolver lub dodaj dowolne typy nieznane statycznie do listy znanych typów - na przykład za pomocą atrybutu KnownTypeAttribute lub dodając je do listy znanych typów przekazanych do DataContractSerializer.
Próbowałem używać KnownType tu i tam, ale bez powodzenia (muszę przyznać, nie jestem zbyt pewny, że jego użycie jest w 100% prawidłowe).
Oto moje interfejsu/klasy:
[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
dodałem Dummy() metoda.
- Przywołanie manekina od klienta działa poprawnie.
- Wywołanie Dummy2 od klienta działa poprawnie.
- Wywołanie Dummy3 z klienta powoduje ten sam błąd.
Edit12AM39 GMT+1
dokonać następujących zmian nie pomogło.
[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
Jeżeli ustawić Dummy3 typ zwracany do wiadomości, wzywa do Dummy3 w pracy kodu klienta.
Coś dziwnego z WCF + polimorfizmem ...
[KnownType (typeof (Message))] działa dobrze, ale musiałem zaktualizować referencje mojego klienta (czego nie zrobiłem aż kilka minut temu). – Serge