我有这个类,我试图从我的 web api 方法中以 XML 的形式返回:
[Serializable]
public partial class LoggedInUser
{
public int UserID { get; set; }
public string EmailAddress { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public short RoleID { get; set; }
public short UserStatusID { get; set; }
public DateTime LastLoginDateTime { get; set; }
}
Web API 方法很简单:
[HttpGet]
public LoggedInUser Me()
{
var user = new LoggedInUser() { FirstName = "Test" };
return user;
}
这是我从浏览器中点击该方法时在 XML 中得到的内容:
<_x003C_FirstName_x003E_k__BackingField>Test</_x003C_FirstName_x003E_k__BackingField>
注意 FirstName 如何更改为其他字段名称。这是由于 [Serializable] 的存在我需要的属性是因为这是在 session 状态为 outProc 时用于在 session 中存储信息的同一个类
我怎样才能解决这个问题,即使 Serializable存在属性时,它将在响应中返回与类定义相同的字段名称。
请您参考如下方法:
默认情况下,Web API 的 XmlMediaTypeFormmatter 使用 DataContractSerializer。
当此序列化程序序列化自动属性时,它会将臭名昭著的 xxx_BackingField 添加到序列化的属性中。为避免这种情况,您可以做两件不同的事情:
- 用
[DataMember]修饰所有自动属性,并继续使用默认的DataContractSerializer - 更改 xml 媒体类型格式化程序默认序列化程序,改为使用
XmlSerializer。您可以像这样更改 global.asax 中的配置:GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;参见 MSDN reference for XmlMediaTypeFormatter.UseXmlSerializer Property了解更多信息。
使用匿名类型,就像其他答案中建议的那样,可以避免这个问题,因为匿名类没有 [DataContract] 属性。问题是,使用该选项,您总是必须使用匿名类型,这可能需要大量输入,甚至容易出错。
