Web服务类型未更新

时间:2011-05-04 14:37:14

标签: .net web-services dynamics-nav

我遇到了一个奇怪的问题。当我通过

将我的一个网站更新为网络服务时
  1. 更新
  2. 删除服务并完全阅读
  3. intellisense仍然报告类型,在这种情况下Document_Type3仍然是服务生成的对象的相同类型。我可以将我的对象类型设置为`Document_Type3'。我建立项目,没有问题。

    enter image description here

    但是,当我运行项目时,我收到编译器错误,说我的Document_Type3对象不包含Order

    Compiler Error Message: CS0117: 'DynamicsNAV.Document_Type3' does not contain a definition for 'Order'
    
    Source Error:
    
    Line 376:                comment.Date = DateTime.Now;
    Line 377:                comment.DateSpecified = true;
    Line 378:                comment.Document_Type = Document_Type3.Order;  <-- right here.
    Line 379:                comment.Document_TypeSpecified = true;
    Line 380:                comment.Line_No = i * 1000;
    

    它到底没有。我可以在那里看到它。

      <xsd:simpleType name="Document_Type">
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="Quote" />
          <xsd:enumeration value="Order" />
        </xsd:restriction>
      </xsd:simpleType>
    

    我可以设置好,编译得很好 - 但我无法运行它。

    我在

    中修改了我的临时文件

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

    认为它可能已经缓存了这些动态生成的对象。我重建了项目,并在临时目录中看到网站与对象一起重新出现。

    当我运行它时 - 同样的事情 - 在浏览器中实际加载之前没有编译器错误。需要注意的一个重要问题是Dynamics NAV正在返回这些服务,并且具有相同名称的类型(如Document_Type)将在末尾附加一个数字。在代码中,Document_Type3再次包含OrderQuote

    到底发生了什么事?

1 个答案:

答案 0 :(得分:1)

这绝对是Visual Studio / Web服务代码生成中的一个错误。这是我对我认为发生的事情以及如何修复它的解释。< / p>

在NAV(或任何其他Web服务)中,存在一个非明确命名的对象类型,在本例中为"Document_Type",显然构建在编译时会出现故障。例如,我可能有三个单独的WSDL对象,它们都定义了文档类型。 e.g。

CustomerSale.wsdl
WebSale.wsdl
VendorSale.wsdl

当Visual Studio代码生成对象时,它会遍历我的每个WSDL对象,找到Document_Type,并相应地枚举。 e.g。

CustomerSale.Document_Type -> Document_Type1
WebSale.Document_Type -> Document_Type2
VendorSale.Document_Type -> Document_Type3

但是,当Web编译对象时,对象会出现故障。 e.g。

CustomerSale.Document_Type -> Document_Type1
WebSale.Document_Type -> Document_Type3
VendorSale.Document_Type -> Document_Type2

我不确定这是否取决于对象或其他变量的字母顺序,但肯定会发生。

我无法看到这些韵律或原因会不同步,但简单的解决方案(在我的情况下)是简单地删除导致编译器混淆的WSDL对象。反正我也不需要它。

为了在运行时找到导致编译器混淆的对象,我反映了类型:

Response.Write(WebSale.Document_Type.GetType().ToString);
Response.End();

然后我去了定义,在这种情况下是Document_Type2,看到它绝对不是同一个对象。然后我从我的Web服务和web.config中删除了该对象 - 然后我重新编译。我的Web对象立即变成了Document_Type2!这清除了所有内容并允许站点在实际浏览器中编译。他们现在同步了。

但是,我知道不是每个人都有可以删除的对象,因为他们实际上可能正在使用这些对象。另一种解决方法是通过反射动态设置对象。您可以改为反映类型并根据需要进行转换,而不是将对象类型绑定到“Doc​​ument_Type2”。 e.g。

//Document type will throw error at run time.
//comment.Document_Type = DynamicsNAV.Document_Type3.Order; <-- removed.
// I don't care what the name of the object is,
// I know that it contains Order.   
var prop = comment.GetType().GetProperty("Document_Type");
prop.SetValue(comment, Enum.Parse(prop.PropertyType, "Order"), null);

我希望这个解决方案可以帮助其他遇到同样问题的人!