Сценарий:Как сериализовать вложенные типы в ответе WCF?
Я нахожусь в процессе создания службы WCF, который предоставляет пользовательские данные. Экземпляр пользователя имеет свойство «Роль». Если я опускаю это свойство, служба работает; если не опустить свойство, служба терпит неудачу. Ниже приведено (очень) упрощенное представление кода.
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1, EmitConformanceClaims = true)]
[ServiceContract(Name = "IService", Namespace = "http://local/version1/")]
public interface IService : IDisposable
{
[WebMethod]
[SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare)]
[OperationContract(Action = "http://local/version1/GetUser")]
GetUserResponse GetUser(GetUserRequest request);
}
[MessageContract(IsWrapped = true, WrapperName = "GetUserResponse")]
[XmlRoot("GetUserResponse")]
public class GetUserResponse
{
[XmlElement(ElementName = "User")]
[MessageBodyMember(Order = 0)]
public User User { get; set; }
}
public class User
{
public int UserId { get; set; }
public string UserName { get; set; }
public Role Role { get; set; }
}
public class Role
{
public string Name { get; set; }
}
Корень проблемы заключается в том, что роль является вложенной/встроенным (как вы это называете ...) в классе User. Кажется, он не может быть сериализован таким образом.
Если поиск по возможным решениям, но не может найти правильное решение. Я пробовал что-то с KnownTypeAttribute в контракте, а также в классе User, но это не сработало.
Вопросы:
- Что такое правильный способ включить свойство Role на классе User?
- Какие атрибуты необходимо добавить, где это сделать?
- Возможные интерфейсы для реализации сериализации?
Заранее благодарим за любые ответы!
Update # 1
После предложений @CPX, я создал дополнительный тестовый код на стороне сервера:
using (StringWriter stringWriter = new StringWriter())
{
XmlSerializer serializer = new XmlSerializer(typeof(GetUserResponse));
serializer.Serialize(stringWriter, response);
string result = stringWriter.ToString();
}
Это приводит к InvalidOperationException с сообщением «Была ошибка порождающей XML-документ ". Это исключение имеет InvalidOperationException (снова) как InnerException, с сообщением «Тип System.Data.Entity.DynamicProxies.User_FAC9CE2C5C9966932C0C37E6677D35437C14CDD08 884AD33C546805E62B7101E не ожидался. Используйте атрибуты XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически. '.
Забыл упомянуть в сообщении, что классы пользователя и роли используются в Entity Framework 4.1. Не догадывалась, должно быть, проблема, но, видимо, это так.
Просьба дать описание того, как служба не работает. Какое исключение вы получаете? –
Вы пытались поместить атрибут [DataContract] и [DataMember]? –
Вы должны добавить атрибуты DataContract и DataMember – meziantou