首页 > 解决方案 > Web Service dll 在 Xamarin 中的行为与 Framework 和 Core 版本不同

问题描述

我有一个 SOAP Web 服务,我需要在广泛的应用程序中调用它,因此我创建了一个面向 .net 标准 2.0 和 .net 框架 4.6.1 的服务 DLL。

DLL 似乎可以在桌面框架应用程序和桌面核心应用程序上正常工作。但是,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 命名空间?

标签: c#androidxamarinsoapxamarin.android

解决方案


推荐阅读