【发布时间】:2011-09-21 12:40:52
【问题描述】:
场景:
我正在创建一个公开用户数据的 WCF 服务。 User 的一个实例有一个名为 Role 的属性。如果我省略此属性,则服务有效;如果不省略该属性,则服务失败。下面是代码的(非常)简化表示。
[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 属性的正确方法是什么?
- 应该在哪里添加哪些属性才能使其发挥作用?
- 实现可序列化的可能接口?
提前感谢您的任何回复!
更新 #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_FAC9CE2C5C9966932C0C37E6677D35437C14CDD08884AD33C546805E62B7101E 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。'。
忘记在帖子中提到,在 Entity Framework 4.1 中使用了 User 和 Role 类。没猜到应该有问题,但显然确实有问题。
【问题讨论】:
-
请描述服务失败的原因。你得到什么例外?
-
您是否尝试放置 [DataContract] 和 [DataMember] 属性?
-
你应该添加 DataContract 和 DataMember 属性
-
@Monty:啊,也许我应该更清楚:) 我的意思不是你可以在服务器端添加一些测试代码,手动序列化返回对象,捕获任何抛出的异常由序列化程序并在调试模式下检查它。
-
@Monty:使用这种方法的原因是,据我所知,没有简单的方法可以查看序列化响应时发生的异常。您可以在服务上启用日志记录,但随后您“事后”捕获它并且无法检查应用程序或异常。
标签: c# .net wcf serialization messagecontract