我遇到了一个奇怪的问题。当我通过
将我的一个网站更新为网络服务时 intellisense仍然报告类型,在这种情况下Document_Type3
仍然是服务生成的对象的相同类型。我可以将我的对象类型设置为`Document_Type3'。我建立项目,没有问题。
但是,当我运行项目时,我收到编译器错误,说我的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再次包含Order
和Quote
。
到底发生了什么事?
答案 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!这清除了所有内容并允许站点在实际浏览器中编译。他们现在同步了。
但是,我知道不是每个人都有可以删除的对象,因为他们实际上可能正在使用这些对象。另一种解决方法是通过反射动态设置对象。您可以改为反映类型并根据需要进行转换,而不是将对象类型绑定到“Document_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);
我希望这个解决方案可以帮助其他遇到同样问题的人!