у меня есть интерфейс и класс, определенный в отдельных сборках, как это:Не удается получить KnownType работать с WCF
namespace DataInterfaces
{
public interface IPerson
{
string Name { get; set; }
}
}
namespace DataObjects
{
[DataContract]
[KnownType(typeof(IPerson)) ]
public class Person : IPerson
{
[DataMember]
public string Name { get; set; }
}
}
Это моя служба Интерфейс:
public interface ICalculator
{
[OperationContract]
IPerson GetPerson ();
}
Когда я обновляю моя служба Ссылка для моего клиента, я получаю это в Reference.cs:
public object GetPerson() {
return base.Channel.GetPerson();
Я надеялся, что KnownType даст мне IPerson вместо " объект "здесь.
Я также пробовал [KnownType(typeof(Person)) ]
с тем же результатом. Я контролирую как клиент, так и сервер, поэтому у меня есть данные DataObjects (где Person) и DataInterfaces (где определены IPerson) в обоих местах. Есть ли что-то очевидное, что мне не хватает? Я думал, что KnownType был ответом на возможность использования интерфейсов с WCF.
----- ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ----- я удалил KnownType из класса Person и добавил
[ServiceKnownType(typeof(Person)) ]
к моему служебному интерфейсу, как это было предложено Ричардом. Прокси-сервер на стороне клиента по-прежнему выглядит одинаково,
public object GetPerson() { return base.Channel.GetPerson();
, но теперь он не взрывается. У клиента просто есть «объект», поэтому он должен передать его в IPerson, прежде чем он станет полезным.
var person = client.GetPerson ();
Console.WriteLine (((IPerson) person).Name);
Надеюсь, это не ответ :), потому что это означает, что я не могу иметь отдельные DataObjects и DataInterfaces, потому что это делает круговую ссылку. 'Person: IPerson' против' KnownType Person для IPerson' ... Я думал, что все равно попробую, но я получаю ошибку компиляции, говоря, что KnownType может использоваться только для класса, struct ... –
Да, им нужно будет перейдите в ту же сборку. В качестве альтернативы, если ваша база была классом, а не интерфейсом, вы могли бы предоставить известные типы через статический метод в базовом классе [KnownType (MethodName = ...)].Или вы можете предоставить известные типы непосредственно сериализатору, а не полагаться на него, чтобы обнаружить их через атрибуты или статический метод. –
Я действительно пытаюсь разделить эти сборки, но я ценю альтернативы - хорошее питание для размышлений. –