инструмент моно wsdl не может проанализировать salesforce enterprise.wsdl - PullRequest
1 голос
/ 02 апреля 2010

Кто-нибудь знает, почему этот wsdl не нравится инструменту mono wsdl? Microsoft разбирает это. XMethods онлайн wsdl валидатор анализирует его. Моно просто не нравится, и я не знаю достаточно, чтобы понять, почему.

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

Там, где некоторые предупреждения при генерации кода:

enterprise.wsdl - Эта веб-ссылка не соответствует WS-I Basic Profile v1.1 R2718: WSDL: привязка в ОПИСАНИИ ДОЛЖНА иметь одинаковый набор wsdl: операции как wsdl: portType, к которому он относится. * Привязка 'SoapBinding', в описании услуги 'Урна: 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>

1 Ответ

2 голосов
/ 26 марта 2011

Старее и мудрее сейчас ...

генерирует C # из wsdl wsdl enterprise.wsdl -n: Sforce -o: SforceService.cs

XmlAnyElement не может иметь пустое пространство имен, поэтому откройте SforceService.cs и удалите его

это ... [System.Xml.Serialization.XmlAnyElement (Пространство имен = "")] public System.Xml.XmlElement [] Any { получить { вернуть this.anyField; } задавать { this.anyField = значение; } }

становится ... public System.Xml.XmlElement [] Any { получить { вернуть this.anyField; } задавать { this.anyField = значение; } }

wsdl генерирует сериализацию xml для закрытых членов, которая не работает и должна быть исправлена ​​

Необработанное исключение: System.InvalidOperationException: член LoginScopeHeaderValueField не найден в классе Sforce.SforceService.

это ... [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] at (обертка remoting-invoke-with-check) System.Net.WebConnectionStream: SetHeaders (byte []) в System.Net.HttpWebRequest.SendRequestHeaders (логическое распространение_ошибки) [0x00000]

это исправлено mozroots, которые получат все сертификаты кораблей mozilla с ...

mozroots --import --sync

тогда все работает как описано

Sforce.SforceService binding = new Sforce.SforceService (); Sforce.LoginResult loginResult = binding.login ("someuser", "somepass"); и т.д ...

...