2011-05-04 57 views
2

我遇到了一个奇怪的问题。当我通过Web服务类型没有更新

  1. 更新我的网站,以Web服务的一个更新它
  2. 删除服务,并且完全readding它

智能感知还报道称,类型,在此case 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

这是怎么回事?

+0

+1的帖子标题。 – 2011-05-04 14:43:14

+0

我遇到同样的问题。你有没有解决这个问题?我可以将所有内容移动到新服务器上,查看已添加到页面/代码单元的所有新功能,但所有枚举都不正确。 – 2011-05-10 16:44:51

+0

@fishboneuk您是否也使用Dynamics NAV? – 2011-05-10 17:20:15

回答

1

这绝对是Visual Studio/Web服务代码生成中的一个错误。下面是我对相关信息的解释,以及 如何解决它, 解决此问题。

在NAV(或任何其他Web服务)中存在非明确命名类型的对象,在这种情况下为"Document_Type",编译时显然构建版本失序。例如,我可能有三个独立的WSDL对象,它们都定义了一个文档类型。例如

CustomerSale.wsdl 
WebSale.wsdl 
VendorSale.wsdl 

当Visual Studio代码一族的对象,它通过我的每一个WSDL对象,发现DOCUMENT_TYPE,并相应地列举。例如

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

但是,当web编译对象时,对象出现乱序。例如

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”之外,您可以改为反映类型并根据需要进行强制转换。例如

//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); 

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