2010-02-12 34 views
0

这很奇怪,我只是想知道是否有人可以向我解释这一点。我有一个由传统的旧asmx风格的Web服务运行的Web服务。我们有这是在没有被显示给消费者这样的内部方法使用的公共财产:由IIS提供的WSDL中缺少的公共属性6

public class User { 
    public string EmployeeID; 

    protected override void DoSomething(){ 
     var foo = EmployeeId; 
    } 
} 

现在这里是怪异的一部分。我们决定摆脱这个领域。但是由于Apache Axis客户端绑定到特定的wsdl,我们不想从wsdl中删除它。因此,我们离开了财产,但在内部方法中删除了它的用法。当我们这样做时,该属性突然从WSDL中丢失......但只在运行IIS6的服务器上。运行IIS 5.1的开发人员仍然可以获得该属性。

我们最终把一个平凡的使用回到方法(获得并将其设置为空字符串)。突然它IIS6服务器上再次出现了。

怎么了?

回答

3

听起来类似于this problem I had一点点。

的属性是不是在WSDL,因为它有一个私人的制定者。

+0

可能的话,在我的情况大家是公开的,然而,类写很久很久以前在.NET 1.something,因此没有足够的{获得;设置;}声明。我认为这可能与你的问题有关。如果是,你可能会得到赏金呢! – ryber 2010-02-16 16:56:48

0

的 “公共字符串雇员;”不是财产声明,而是领域声明。你确定,wsdl的类是生成的,有一个属性不是字段?

+0

当作为公共字段时,该字段被列为 ryber 2010-02-17 15:24:21

0

是它有.NET 3.5偶然安装消失在服务器,同时仍然显示它没有那个版本的服务器?不确定this question可能与您遇到的是同一件事,或者您将字段/属性标记为[Obsolete],而.NET(2.0及更高版本)不会序列化。

0

我的猜测是,你看到的编译器优化的可爱的副作用之一:

  • 你就是我的从未使用的字段级别宣言。
  • 编译器在其许多遍中的一个中看到了这一点,并说“嘿,没有人使用这个”
  • 编译器删除声明,这个微小的优化不会伤害任何人的内容。
  • 稍后,生成WSDL时,程序集会反映出来,现在缺少没有人使用的良好公共变量。

现在理论上,这应该只发生在“发布构建”上,但我对编译器“授权”做出的各种优化知之不多,无法给出明确的答案。