2017-07-19 66 views
0

我們正在嘗試使用C#和.NET Framework 4.0(也試過2.0)消耗的Java Web服務,並已運行到一個奇怪的錯誤:消費的Java Web服務用C#,錯誤無法生成臨時類

There was an error in serializing body of message userServiceAssignList1: 'Unable to generate a temporary class (result=1). 
error CS0030: Cannot convert type 'string[]' to 'string[][]' 
error CS0029: Cannot implicitly convert type 'string[][]' to 'string[]' 
error CS0029: Cannot implicitly convert type 'string[][]' to 'string[]' 
'. Please see InnerException for more details. 

谷歌搜索基本上已經沒有任何作爲一個相當常見的錯誤,在C#中錯誤地編碼字符串和字符串數組。

的C#代碼基本上是這樣的,超級簡單,其中 「localhost」 的是Web服務或服務的參考:

static void Main(string[] args) 
{ 
    localhost.AdvancedBusinessTestIFClient abctic = new localhost.AdvancedBusinessTestIFClient(); 
    string[] services = {"Auto Attendant"}; 
    var resp = abctic.userServiceAssignList("echo", "SQA_P17615", services, null); 

    Console.WriteLine(resp.ToString()); 
} 

在研究中,我們發現這個類似的問題: https://developer.salesforce.com/forums/?id=906F0000000AiPEIA0

所以看起來成爲微軟系列化和wsgen相關的漏洞,因爲人們已經抱怨了7年多了。它似乎與鋸齒狀陣列有關,例如,一個「字符串[] []」。

正在使用的wsdl是一個用java編寫的庫,包含BroadSoft Broadworks類,它們使用來自其XSD文件的jax-b生成的類。它被託管在一個JBoss EAP 7應用服務器Java 1.8中。

基於Salesforce的鏈接和 「串[] []」 的提示,我們搜索了Reference.cs文件關於 「[] []」 果然發現這一點:

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1586.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="C")] 
public partial class OCITable : object, System.ComponentModel.INotifyPropertyChanged { 

    private string[] colHeadingField; 

    private string[][] rowField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("colHeading", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)] 
    public string[] colHeading { 
     get { 
      return this.colHeadingField; 
     } 
     set { 
      this.colHeadingField = value; 
      this.RaisePropertyChanged("colHeading"); 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=1)] 
    //[System.Xml.Serialization.XmlArrayItemAttribute("col", typeof(string[][]), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)] 
    [System.Xml.Serialization.XmlArrayItemAttribute("col", typeof(string[][]), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)] 
    public string[][] row { 
     get { 
      return this.rowField; 
     } 
     set { 
      this.rowField = value; 
      this.RaisePropertyChanged("row"); 
     } 
    } 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

注意private string[][] rowField;

它正在造成這個片段的Java代碼:

public class OCITable { 

    @XmlElement(required = true) 
    protected List<String> colHeading; 
    protected List<OCITableRow> row; 


public class OCITableRow { 

    @XmlElement(required = true) 
    protected List<String> col; 

所以我們可以看到它的列表的多維表。

的WSDL塊看起來是這樣的:

<xs:complexType name="OCITable"> 
    <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="colHeading" type="xs:string"/> 
     <xs:element maxOccurs="unbounded" minOccurs="0" name="row" nillable="true" type="tns:OCITableRow"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="OCITableRow"> 
    <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="col" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

回到Salesforce的鏈接,似乎其他應用程序,如了SoapUI和Java應用程序有沒有問題與數組的數組或交錯數組但是C#.Net有這個問題已經有一段時間了。

+0

這是什麼問題?在目前的狀態下,這是更多的錯誤報告 – Moira

+0

@ 1blustone感謝您的評論!這確實是一個錯誤報告,但答案最終提供了一個解決方案,我想在這裏得到這個問答,因爲我們花了大約一天的時間研究並試圖找到解決方法! – JGlass

回答

0

我們遇到了很多與上述問題有關的問題,特別是谷歌返回的結果不佳,所以我們想幫助任何其他人可能遇到這個問題在未來尤其是看到我們如何不能很容易修改java端的事情,因爲很多jax-b編組和解組正在進行並被自動處理。

Salesforce的鏈接讓我們知道問題是和這個環節提出了一個可能的解決方案: How can I fix the web reference proxy that Visual Studio generated to handle jagged arrays?

我的。NET的合作伙伴@lavilla開始尋找執行上面的代碼變化,雖然我們真的討厭不得不修改由此產生的代理代碼將來需要重新實現(預構建步驟將對此有所幫助),並且他通過@Synia跑過了這個有趣的Stack Exchange Q & A:C# Deserializing an XML with repeating tags

謝謝@Synia也遇到了同樣的問題,但如果您的問題中包含「BroadSoft」或「BroadWorks」,可能會出現問題(有人可能會將BroadSoft和BroadWorks添加爲標籤,因爲我沒有足夠的空間點)。這是我們正在尋找的確切解決方案,謝謝@DBC的答案和詳細解釋。

修改以前在問題中顯示的Reference.cs代碼,以準確反映@DBC推薦的完美工作方式!