c# - 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 命名空间?
解决方案
推荐阅读
- vba - 从组合框调用变量访问 VBA 时出现问题
- r - 将多个字符串与 R 中跨数据帧的设置值匹配
- sql - 在 SQL 中重命名行计数列
- arrays - 使用 8 个不同 .wav 文件的单个按钮的随机声音发生器。每个文件命名为sound1.wav、sound2.wav.... sound8.wav
- javascript - 我的函数没有在另一个函数中调用
- facebook - 从 Dialogflow 获取用户经纬度 - FB Messenger 集成
- javascript - 如何在 x 轴上制作带有动态月份的 Chart.js
- javascript - 无法使用键在数组中选择值
- r - 比较插入符号模型对象的最佳功能
- mongodb - Mongoengine 和 Pymongo?