.NET Web服务 - 如何使属性不可见

时间:2011-10-06 07:41:54

标签: c# .net web-services

我有一个ASP.NET(.asmx)Web服务项目,其方法如下:

 public int GetData(Data d);

Data类具有属性:

  public class Data
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

我希望客户端看到“Id”属性,而不是“Name”属性。它们都必须公开,因为应用程序的内部逻辑需要公开这些属性。

那么如何设置“名称”属性对客户端不可见而不更改其公共访问者,并且不设置私有get,私有集?

6 个答案:

答案 0 :(得分:6)

您可以使用XmlIgnore标记阻止序列化,客户端生成的代理类将不包含属性Name。

public class Data
{
  public int Id{get;set;}

  [XmlIgnore()]
  public string Name{get;set;}
}

答案 1 :(得分:1)

我相信您正在发现使用DTO的一个很好的理由。 DTO(数据传输对象)是您想要向外界展示的。

因此,在您的示例中,您的Data对象是您在应用程序内部使用的域对象,但它包含您不希望提供给其他任何人的属性。然后,您拥有DataDto对象,该对象是您与其他人共享的外部公开对象。

然后,在您发送信息之前,您将从Data映射到DataDto,如果有必要,如果您在请求中收到DataDto,则会映射另一种方式。 (或者使用像AutoMapper这样的工具)。

public class Data
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class DataDto
{
    public int Id { get; set; }
}

答案 2 :(得分:0)

公共类数据     {       public int Id {get;组; }       public string Name {get;私人集; }     }

我从未这样做过......但这可行吗? (在@ChrisBD回答之后)

public class Data
{
  public int Id { get; set; }
  public string Name { get; internal set; }
}

答案 3 :(得分:0)

如果你可以使用WCF,当至少有一个属性/成员被标记[DataMember]属性时,所有标记都被序列化,所有其他都不是

答案 4 :(得分:0)

使用内部访问修饰符,因为这限制了对同一程序集中的项目的访问权限。

public class Data
{
  public int Id{get;set;}
  internal string Name{get;set;}
}

答案 5 :(得分:0)

您也可以使用,

[IgnoreDataMember]
public string Name
{
    get;
    set;
}