我們正在嘗試使用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有這個問題已經有一段時間了。
這是什麼問題?在目前的狀態下,這是更多的錯誤報告 – Moira
@ 1blustone感謝您的評論!這確實是一個錯誤報告,但答案最終提供了一個解決方案,我想在這裏得到這個問答,因爲我們花了大約一天的時間研究並試圖找到解決方法! – JGlass