C# 如何确保为通过webservice公开的类的属性设置初始值

C# 如何确保为通过webservice公开的类的属性设置初始值,c#,.net,web-services,wcf,asmx,C#,.net,Web Services,Wcf,Asmx,我有一个在构造函数中初始化其属性的类 public class Criteria { public bool Chapter1 { get; set; } public bool Chapter2 { get; set; } ... public uint MaxResults { get; set; } public int Hits { get; set; } public Criteria() { Chapter1

我有一个在构造函数中初始化其属性的类

public class Criteria
{
    public bool Chapter1 { get; set; }
    public bool Chapter2 { get; set; }
    ...
    public uint MaxResults { get; set; }
    public int Hits { get; set; }

    public Criteria()
    {
        Chapter1 = false;
        Chapter2 = false;
        ...
        MaxResults = 100;
        Hits = -1;
    }
}
此类在web服务内部用于配置数据库上的搜索。当我在内部构造类时,将执行正确的初始化,并且操作与预期的一样

但是,该类也作为方法中的参数公开给此Web服务:

    [WebMethod]
    public List<xxx> GetxxxCollection(string requestingUserName, Criteria sc)
    {
      ...
    }
[WebMethod]
公共列表GetxxxCollection(字符串requestingUserName,标准sc)
{
...
}
在客户端调用此web服务之前,将构造和配置Criteria对象。但是,由于构造函数是通过web服务公开的,因此实际上不会调用构造函数,客户端也不会总是正确设置所有必需的值


鉴于我们对客户机代码的控制有限,确保设置适当初始值的最佳策略是什么?

您无法以任何方式控制客户机。客户端上的“服务”类与包含构造函数的服务类没有任何关系。它只是一个“代理”类,不是真实的对象。

也许您可以使用
可空的
字段,这样您就知道客户端没有在字段中设置任何值。

不要在类中使用自动实现的属性,而是使用旧的手动属性和支持字段,默认情况下,可以在不调用构造函数的情况下初始化这些字段:

public class Criteria
{
  private int _maxResults = 100;

  //-----------------------------------------------------------------------

  public int MaxResults
  {
    get{ return _maxResult; }
    set{ _maxResults = value; }
  }

}

我已经有一段时间没有使用那些基本的web服务了,但是IIRC,在反序列化之前不是调用了无参数构造函数吗?无论如何,您的属性可以在字段声明中设置初始值的支持字段,而不是在构造函数中设置它们。编辑:但如果默认构造函数正在运行,则可能需要再次检查正在发送的数据:可能您没有发送正确的信息。ASMX是一种遗留技术,不应用于新的开发。WCF或ASP.NET Web API应用于Web服务客户端和服务器的所有新开发。提示:Microsoft已停用MSDN上的。客户端将负责正确初始化对象。如果客户没有足够的知识这样做,那么您需要重新考虑您的方法/重新设计您的应用程序。-1:您是否在ASMX服务中尝试过可为空的值类型?如果客户端已经将值设置为null呢?不,我没有,这就是为什么我说,
null
可以等于notset,前提是
null
本身不是一个值。这不清楚雪人检查了这个东西,它没有初始化为100,值为0。