В WCF, классы передачи данных наследуют друг другу?
в службе WCF, у меня есть два класса с атрибутом [DataContract]. Один из этих классов имеет отношение "is-a" с другим - поэтому класс B может наследовать от класса A. Однако, когда я настраиваю наследование между этими двумя классами, оба обозначаются атрибутом [DataContract], метаданные не загружаются при тестировании служб.
возможно ли это в WCF? Я упускаю еще один атрибут?
[DataContract]
public class A
{
[DataMember]
public MyCustomType AValue1{ get; set; }
[DataMember]
public MyCustomType AValue2 { get; set; }
}
[DataContract]
public class B: A
{
[DataMember]
public double BValue1{ get; set; }
[DataMember]
public double BValue2 { get; set; }
}
Примечание: пользовательские типы также определены использование контрактов данных.
обновление: ниже приведена ошибка:
ошибка: не удается получить метаданные из http://localhost:8002/GISDataServices/mex если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Для получения справки о включении публикации метаданных обратитесь к документации MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки Exchange:http://localhost:8002/GISDataServices/mex метаданные содержат ссылку, которая не может быть решена:'http://localhost:8002/GISDataServices/mex'.
Receivera:InternalServiceFault
сервер не смог обработать запрос из-за внутренней ошибки. Для получения дополнительной информации об ошибке включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведение конфигурации) на сервере, чтобы отправить сведения об исключении обратно клиенту или включить трассировку в соответствии с документацией Microsoft .NET Framework 3.0 SDK и проверить журналы трассировки сервера.HTTP GET Error URI:http://localhost:8002/GISDataServices/mex произошла ошибка при загрузке 'http://localhost:8002/GISDataServices/mex'. Сбой запроса с состоянием HTTP 400: Bad Запрос.
обновление 2: см. мой ответ ниже.
3 ответов
да, но вам нужно украсить базовый класс с помощью [KnownTypeAttribute], построив его с типом производного класса. Например:
[DataContract]
[KnownType(typeof(B))]
public class A
{
[DataMember]
public string Value { get; set; }
}
[DataContract]
public class B : A
{
[DataMember]
public string OtherValue { get; set; }
}
Хорошо, я понял вопрос. Ответ...Я идиот. Это не имело никакого отношения к наследству. В базовом классе у меня был член контракта данных без предложения свойства " set "- только "get". Дох!!! Включение предложения " set " заставило его работать как шарм.
извините за сумбур.
на основе этого теста он должен работать нормально. Имеют ли оба класса конструкторы по умолчанию? Вы используете Auto-Properties. Обратите внимание, что в этом базовом примере атрибуты не требуются. Кроме того, как упоминал Дэвид Мортон, в зависимости от того, какой элемент вы возвращаете, вам может понадобиться атрибут KnownType, я не 100%, но известный тип может потребоваться для контракта на операцию.
class Program
{
static void Main(string[] args)
{
var serializer = new DataContractSerializer(typeof(Employee));
var employee = new Employee() { Name="Joe", Salary=100000 };
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, employee);
ms.Position = 0;
var newEmployee = serializer.ReadObject(ms) as Employee;
}
Console.ReadKey();
}
}
[DataContract]
public class Employee : Person
{
[DataMember]
public decimal Salary { get; set; }
}
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
}
[ServiceContract]
interface IEmployeeService
{
[OperationContract]
Person GetPerson();
[OperationContract]
Employee GetEmployee();
[OperationContract]
[KnownType(typeof(Employee))]
Person GetEmployeeAsPerson();
}