В Xamarin веб-служба ведет себя иначе, чем версии Framework и Core. - PullRequest
0 голосов
/ 11 января 2020

У меня есть SOAP веб-служба, которую мне нужно вызывать в широкомасштабных приложениях, поэтому я создал служебную DLL, предназначенную для обоих. net стандарта 2.0 и. net фреймворка 4.6.1.

Кажется, что DLL прекрасно работает в приложениях Desktop Framework и в приложениях Desktop Core. Тем не менее, поведение в проекте Xamarin Android просто немного отличается от того, что есть у двух других.

Правильно отправленное сообщение от двух других приложений выглядит следующим образом:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ZBAPI_GOODSMVT_CREATE xmlns="urn:sap-com:document:sap:rfc:functions">
        <CODE xmlns="">
            <GM_CODE>03</GM_CODE>
        </CODE>
        <HEADER xmlns="">
            <PSTNG_DATE>2019-12-08</PSTNG_DATE>
            <DOC_DATE>2019-12-08</DOC_DATE>
        </HEADER>
        <ITEM xmlns="">
            ... data here ...
        </ITEM>
        <RETURN xmlns="">
            ... data here ...
        </RETURN>
    </ZBAPI_GOODSMVT_CREATE>
</s:Body>

И успешно отправленное (но не обработанное) сообщение с устройства android выглядит так:

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ZBAPI_GOODSMVT_CREATE>
        <CODE>
            <GM_CODE>03</GM_CODE>
        </CODE>
        <HEADER>
            <PSTNG_DATE>2019-12-08</PSTNG_DATE>
            <DOC_DATE>2019-12-08</DOC_DATE>
        </HEADER>
        <ITEM>
            ... data here ...
        </ITEM>
        <RETURN>
            ... data here ...
        </RETURN>
    </ZBAPI_GOODSMVT_CREATE>
</s:Body>

Таким образом, почти идентично , за исключением того, что каждое пространство имен внутри элемента body было удалено. Я подтвердил с помощью SOAPUI, что Все необходимы пространства имен, даже пустые.

Рассматриваемая DLL, как уже говорилось, -. net стандарт 2.0, и сервис был импортирован с использованием предоставленного поставщиком файла wsdl.

внутри кода DLL, который я называю службой, следующим образом:

private void RunRequest(ServiceData payload)
    {
        var binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
        binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
        var address = new EndpointAddress("https:\\serviceaddress.com\service");

        new ChannelFactory<ServiceChannel>(binding, address).Using(factory =>
        {

            factory.Credentials.UserName.UserName = "Uset";
            factory.Credentials.UserName.Password = "Pass";

            var proxy = factory.CreateChannel();

            proxy.Open();

            var context = new OperationContext((IClientChannel)proxy);

            var prevOpContext = OperationContext.Current;
            OperationContext.Current = context;
            try
            {
                var results = proxy.ServiceChannel_CREATEAsync(payload).ConfigureAwait(false).GetAwaiter().GetResult().SerivceChannelResponse;
                System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ServiceChannelResponse));
                using StringWriter text = new StringWriter();
                serializer.Serialize(text, results);
                Message = text.ToString();
            }
            catch
            {
                throw;
            }
        });

как я могу принудительно включить включение пространств имен xmlns на все платформы?

...