1

任何人都知道为什么 mono wsdl 工具不喜欢这个 wsdl?微软解析它。XMethods 在线 wsdl 验证器对其进行解析。Mono 似乎不喜欢它,我也不知道为什么。

# the error
mmcaughan@mmcaughan-dsktop:~/Projects/sftest$ wsdl enterprise.wsdl
Web Services Description Language Utility
Mono Framework v2.0.50727.1433

生成代码时出现一些警告:

enterprise.wsdl - 此 Web 引用不符合 WS-I Basic Profile v1.1 R2718:描述中的 wsdl:binding 必须具有与其引用的 wsdl:portType 相同的一组 wsdl:operations。* 绑定“SoapBinding”,在服务描述“urn:enterprise.soap.sforce.com”中

写入文件'SforceService.cs'

相关的 WSDL 部分(我认为)

  <!-- Soap PortType -->
    <portType name="Soap">
        <operation name="login">
            <documentation>Login to the Salesforce.com SOAP Api</documentation>
            <input message="tns:loginRequest"/>
            <output message="tns:loginResponse"/>
            <fault message="tns:LoginFault" name="LoginFault"/>
            <fault message="tns:UnexpectedErrorFault" name="UnexpectedErrorFault"/>
            <fault message="tns:InvalidIdFault" name="InvalidIdFault"/>
        </operation>


 <!-- Soap Binding -->
    <binding name="SoapBinding" type="tns:Soap">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="login">
            <soap:operation soapAction=""/>
            <input>
                <soap:header use="literal" message="tns:Header" part="LoginScopeHeader"/>
                <soap:body parts="parameters" use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
            <fault name="LoginFault">
                <soap:fault name="LoginFault" use="literal"/>
            </fault>
            <fault name="UnexpectedErrorFault">
                <soap:fault name="UnexpectedErrorFault" use="literal"/>
            </fault>
            <fault name="InvalidIdFault">
                <soap:fault name="InvalidIdFault" use="literal"/>
            </fault>
        </operation>
4

1 回答 1

2

现在年纪大了,懂事了……

从 wsdl wsdl enterprise.wsdl -n:Sforce -o:SforceService.cs 生成 C#

XmlAnyElement 不能有空的命名空间,因此弹出打开 SforceService.cs 并将其删除

这... [System.Xml.Serialization.XmlAnyElement(Namespace="")] public System.Xml.XmlElement[] Any { get { return this.anyField; } 设置 { this.anyField = 值;} }

变为... public System.Xml.XmlElement[] Any { get { return this.anyField; } 设置 { this.anyField = 值;} }

wsdl 针对私有成员生成 xml 序列化,这不起作用并且必须修复

未处理的异常:System.InvalidOperationException:在类 Sforce.SforceService 中找不到成员 LoginScopeHeaderValueField。

这... [System.Web.Services.Protocols.SoapHeaderAttribute("LoginScopeHeaderValueField")]

变成... [System.Web.Services.Protocols.SoapHeaderAttribute("LoginScopeHeaderValue")]

搜索并替换 ValueField" 为 ValueField"

那么你可能会得到这个,这是一个失败,因为 mono 没有在信任库中安装任何根证书,所以 https 失败

未处理的异常:System.Net.WebException:写入请求时出错:身份验证或解密失败。在 System.Net.WebConnectionStream.WriteHeaders () [0x00000] 在 System.Net.WebConnectionStream.SetHeaders (System.Byte [] 缓冲区) [0x00000] 在 (wrapper remoting-invoke-with-check) System.Net.WebConnectionStream:SetHeaders System.Net.HttpWebRequest.SendRequestHeaders 处的(字节 [])(布尔值传播错误)[0x00000]

它由 mozroots 修复,它将获得 mozilla 附带的所有证书...

mozroots --import --sync

然后一切都按描述进行

Sforce.SforceService 绑定 = new Sforce.SforceService(); Sforce.LoginResult loginResult = binding.login("someuser", "somepass"); ETC...

于 2011-03-26T02:07:28.800 回答