C# Web服务dll在Xamarin中的行为与框架和核心版本不同

C# Web服务dll在Xamarin中的行为与框架和核心版本不同,c#,android,xamarin,soap,xamarin.android,C#,Android,Xamarin,Soap,Xamarin.android,我有一个SOAP web服务,我需要在广泛的应用程序中调用它,因此我创建了一个面向.net标准2.0和.net framework 4.6.1的服务DLL DLL似乎可以在桌面框架应用程序和桌面核心应用程序上正常工作。然而,Xamarin Android项目的行为与其他两个项目略有不同 其他两个应用程序正确发送的消息如下所示: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xml

我有一个SOAP web服务,我需要在广泛的应用程序中调用它,因此我创建了一个面向.net标准2.0和.net framework 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>


03

2019-12-08
2019-12-08
... 这里的数据。。。
... 这里的数据。。。

安卓设备成功发送(但未处理)的消息如下:

    <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>


03

2019-12-08
2019-12-08
... 这里的数据。。。
... 这里的数据。。。

除了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;
            }
        });
private void运行请求(ServiceData负载)
{
var binding=新的BasicHttpBinding();
binding.Security.Mode=BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType=HttpClientCredentialType.Basic;
binding.Security.Transport.ProxyCredentialType=HttpProxyCredentialType.Basic;
var address=新的端点地址(“https:\\serviceaddress.com\service”);
新的ChannelFactory(绑定,地址)。使用(factory=>
{
factory.Credentials.UserName.UserName=“Uset”;
factory.Credentials.UserName.Password=“通过”;
var proxy=factory.CreateChannel();
proxy.Open();
var context=new OperationContext((IClientChannel)代理);
var prevOpContext=OperationContext.Current;
OperationContext.Current=上下文;
尝试
{
var results=proxy.ServiceChannel_CREATEAsync(有效负载).ConfigureAwait(false).GetAwaiter().GetResult().SerivChannelResponse;
System.Xml.Serialization.XmlSerializer serializer=new System.Xml.Serialization.XmlSerializer(typeof(ServiceChannelResponse));
使用StringWriter text=new StringWriter();
序列化(文本、结果);
Message=text.ToString();
}
抓住
{
投掷;
}
});

如何在所有平台上强制包含xmlns名称空间?

如果使用相同的框架时,相同的代码在不同的平台上产生不同的输出,我会将其作为一个错误提交,我计划这样做,但首先我想检查一下这里是否有一个解决方法,或者我是否犯了错误。因为我实际上没有需要几个月的等待时间(如果!)来修复它。好吧,黑客的解决方法是在发送之前手动插入名称空间