Skip to main content
 首页 » 编程设计

c#之从 web api 返回 XML 更改字段名称

2024年02月13日30pengyingh

我有这个类,我试图从我的 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] 属性。问题是,使用该选项,您总是必须使用匿名类型,这可能需要大量输入,甚至容易出错。