2011-05-04 59 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); 

我希望這個解決方案可以幫助其他遇到相同問題的人!