我需要从磁盘上加载的肥皂消息,到生成的代理的类型。WCF从HTTP服务器接收消息时会这样做,因此我应该能够从磁盘上进行。
我使用WCF消费Web服务,我从远程WSDL生成了代理客户端。
这是我从网络中收到的XML结构(它已记录了System.ServiceModel.MessageLogging(,我想将其解析到生成的类crresponse中。:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:PourtuIntf" xmlns:ns2="ns2:PourtuIntf-IPourtu">
<SOAP-ENV:Header/>
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns2:GetCRResponse>
<return>
<ResultCode>0</ResultCode>
<CR>
<Theme SOAP-ENC:arrayType="ns1:ItemType[5]">
<item>
<Key/>
<Section SOAP-ENC:arrayType="ns1:Section[3]">
...
当我调用Web服务的操作" GETCR"时,该消息会正确转换为WCF生成的代理客户端类型GetCrresponse,但是我不知道WCF是如何工作的,我需要从磁盘中解析文件。
我试图以这种方式解析消息:
GetCRResponse body;
using (var xmlReader = XmlReader.Create("Requests\CR.xml"))
{
Message m = Message.CreateMessage(xmlReader, int.MaxValue, MessageVersion.Soap11);
body = m.GetBody<GetCRResponse>();
}
在Geybody方法中,此异常提出:
Expected element 'ActGetCRResponse' from namespace 'http://schemas.datacontract.org/2004/07/Pourtu.PourtuClient'.. Detecting 'Element' with name 'ActGetCRResponse', namespace 'urn:PourtuIntf-IPourtu'
。
我尝试使用SoapFormatter:
using ( FileStream fs = new FileStream("Requests\CR.xml", FileMode.Open) )
{
SoapFormatter formatter = new SoapFormatter();
body = (ActGetCRResponse)formatter.Deserialize(fs);
}
..避难所抛出以下异常:分析错误,与XML键'ns2 getCrresponse相关的组件。
我不能使用XML序列化器进行序列化以getCresponse,因为属性soap-enc:arrayType:arraytype需要由肥皂序列化器解释。
您应该能够使用XmlSerializer
在SoapReflectionImporter
的帮助下完成此操作。
var importer = new SoapReflectionImporter("ns2:PourtuIntf-IPourtu");
var mapping = importer.ImportTypeMapping(typeof(GetCRResponse));
var serializer = new XmlSerializer(mapping);
var response = serializer.Deserialize(reader) as GetCRResponse;
SoaprefreflectionImporter类提供类型映射到 肥皂编码的消息部分,如Web服务描述中所定义的 语言(WSDL(文档。仅在Web服务或客户端时使用它 指定SOAP编码,如SOAP 1.1的第5节所述 规格。
以下命令用于从WSDL生成您的客户合同
SvcUtil.exe IPlotiservice.wsdl /t:code /serviceContract
更新:
Message m = Message.CreateMessage(XmlReader.Create("C:\testSvc\login.xml"), int.MaxValue, MessageVersion.Soap11);
SoapReflectionImporter importer = new SoapReflectionImporter(new SoapAttributeOverrides(), "urn:PlotiIntf-IPloti");
XmlTypeMapping mapp = importer.ImportTypeMapping(typeof(ActGetCRResponse));
XmlSerializer xmlSerializer = new XmlSerializer(mapp);
var o = (ActGetCRResponse)xmlSerializer.Deserialize(m.GetReaderAtBodyContents());
参考