最近在集成项目项目中遇到一个问题:在用最新版本(API 32.0)Enterprise WSDL在.Net 中做集成时,初始化SforceService 时会初始化类错误。这算是Salesforce 在新版本SOAP API 中的一个BUG ,在以前版本没有这个问题,需要大家注意下。
具体错误信息如下:
message: Sync Error,System.TypeInitializationException: The type initializer for ‘SyncUtility.SForce.DataUility‘ threw an exception. ---> System.TypeInitializationException: The type initializer for ‘SyncUtility.SForce.ServiceProvider‘ threw an exception. ---> System.InvalidOperationException: Unable to generate a temporary class (result=1).
error
CS0030: Cannot convert type
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn[]‘ to
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn‘
error
CS0030: Cannot convert type
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn[]‘ to
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn‘
error
CS0029: Cannot implicitly convert type
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn‘ to
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn[]‘
error
CS0029: Cannot implicitly convert type
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn‘ to
‘SyncUtility.SForce.EnterpriseService.ListViewRecordColumn[]‘
产生问题的原因:
是Salesforce新版本的WSDL触发了Microsoft 的关于WSDL 的一个限制。
解决方法如下:
方法一:
在生成Proxy Class 后,替换所有的ListViewRecordColumn[][] 为ListViewRecordColumn[];
方法二:
在WSDL 中进行修改,保存后再生成Proxy Class .具体修改操作如下:
将
<complexType name="ListViewRecordColumn">
<sequence>
<element name="fieldNameOrPath" type="xsd:string"/>
<element name="value" type="xsd:string" nillable="true"/>
</sequence>
</complexType>
修改为:
<complexType name="ListViewRecordColumn">
<sequence>
<element name="fieldNameOrPath" type="xsd:string"/>
<element name="value" type="xsd:string" nillable="true"/>
</sequence>
</complexType>
PS:
在生成WSDL 时,如遇到如下截图所示,这个不是Salesforce 的问题,是Firefox 浏览器显示的问题,大家不要惊慌,也不要纠结。鼠标右键另存为Enterprise.WSDL,文件类型为所有文件,保存后就得到你所需的wsdl .
Refrence:
Microsoft 关于WSDL 的限制:
https://connect.microsoft.com/VisualStudio/feedback/details/471297