C# Web服务dll在Xamarin中的行为与框架和核心版本不同
我有一个SOAP web服务,我需要在广泛的应用程序中调用它,因此我创建了一个面向.net标准2.0和.net framework 4.6.1的服务DLL DLL似乎可以在桌面框架应用程序和桌面核心应用程序上正常工作。然而,Xamarin Android项目的行为与其他两个项目略有不同 其他两个应用程序正确发送的消息如下所示: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
<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名称空间?如果使用相同的框架时,相同的代码在不同的平台上产生不同的输出,我会将其作为一个错误提交,我计划这样做,但首先我想检查一下这里是否有一个解决方法,或者我是否犯了错误。因为我实际上没有需要几个月的等待时间(如果!)来修复它。好吧,黑客的解决方法是在发送之前手动插入名称空间