当前位置: 首页 > 编程语言 > C#

如何访问SOAP响应分享

时间:2023-04-10 14:42:28 C#

C#学习教程:如何访问SOAP响应派对网络服务连接。我使用thinktecture的WSCF插件来提供WSDL来创建客户端实现。由于我无法控制的原因,SOAP消息交换使用WSE2.0来确保安全(必须修改thinctecture实现以包含WSE2.0参考)。除了“正常”数据包之外,我还附加了之前调用其他Web服务时存储的X509证书和二进制安全令牌。我们正在使用某种SSL加密——我不知道细节。所有必要的序列化/反序列化都包含在Web服务客户端中——这意味着在调用客户端后控制返回给我时,SOAP响应中包含的整个XML字符串对我不可用——只需反序列化组件。不要误会我的意思——我认为这很棒,因为这意味着我不必自己做。然而,为了让我有一些值得存储/归档的东西,我不得不在根元素上重新序列化数据。这似乎是一种资源浪费,因为我的结果是在SOAP响应中。现在我的问题是:如何访问SOAP响应的“清晰”版本,这样我就不必重新序列化我存储/归档的所有内容?编辑-我的应用程序是一个作为Web服务运行的“不可见”Windows应用程序-由WebsphereMQ客户端触发器监视器触发。我认为ASP.NET解决方案行不通。编辑——由于目前的共识是我的应用程序是否是ASP.NET并不重要,因此我将试一试CodeMelt(以及Chris的扩展)解决方案。您可以使用现有WSE2.0框架中的SoapExtension来拦截来自服务器的响应。公共类MyClientSOAPExtension:SoapExtension{StreamoldStream;流式传输;//将表示SOAP请求或SOAP响应的Stream保存到//本地内存缓冲区中。publicoverrideStreamChainStream(Streamstream){oldStream=stream(newMeStream=);返回新流;}publicoverridevoidProcessMessage(SoapMessagemessage){switch(message.Stage){caseSoapMessageStage.BeforeDeserialize://在XML反序列化到object.break之前;案例SoapMessageStage.AfterDeserialize:中断;休息;案例SoapMessageStage.AfterSerialize:中断;默认值:thrownewException("Invalidstage...");在SoapMessageStage.BeforeDeserialize阶段,您可以从oldstream中读取所需的预期数据(例如,使用XmlReader)。然后将预期的数据存储在某个地方供您自己使用,您还需要将旧流数据转发到新流,以便Web服务的后期阶段使用数据,例如将XML反序列化为对象。从MSDN将所有流量记录到Web服务的示例这是一个示例,您可以使用VisualStudioWeb参考设置http://footballpool.dataaccess.eu/data/info.wso?WSDL基本上您必须在Web服务中调用链插入一个XmlReader间谍程序,它将重建原始XML。我相信这种方式比使用SoapExtensions更简单。解决方案解决方案的灵魂来自http://orbinary.com/blog/2010/01/getting-the-raw-soap-xml-sent-via-soaphttpclientprotocol/usingSystem;使用System.Collections.Generic;使用系统文本;使用System.Net;使用System.IO;使用System.Reflection;使用System.Xml;命名空间ConsoleApplication1{公共类XmlReaderSpy:XmlReader{XmlReader_me;publicXmlReaderSpy(XmlReaderparent){_me=parent;}//////提取的XML。///公共字符串Xml;#region必须实现的抽象方法publicoverrideXmlNodeTypeNodeType{get{return_me.NodeType;}}publicoverridestringLocalName{get{return_me.LocalName;}}publicoverridestringNamespaceURI{get{return_me.NamespaceURI;}}publicoverridestringPrefix{get{return_me.Prefix;}}publicoverrideboolHasValue{get{return_me.HasValue;}}publicoverridestringValue{get{return_me.Value;}}publicoverrideintDepth{get{return_me.Depth;}}公共覆盖海峡ingBaseURI{get{return_me.BaseURI;}}publicoverrideboolIsEmptyElement{get{return_me.IsEmptyElement;}}publicoverrideintAttributeCount{get{return_me.AttributeCount;}}publicoverridestringGetAttribute(inti){return_me.GetAttribute(i);}publicoverridestringGetAttribute(stringname){return_me.GetAttribute(name);}publicoverridestringGetAttribute(stringname,stringnamespaceURI){return_me.GetAttribute(name,namespaceURI);}publicoverridevoidMoveToAttribute(inti){_me.MoveToAttribute(i);}publicoverrideboolMoveToAttribute(stringname){return_me.MoveToAttribute(name);}publicoverrideboolMoveToAttribute(stringname,stringns){return_me.MoveToAttribute(name,ns);}publicoverrideboolMoveToFirstAttribute(){return_me.MoveToFirstAttribute();}publicoverrideboolMoveToNextAttribute(){return_me.MoveToNextAttribute();}publicoverrideboolMoveToElement(){return_me.MoveToElemen吨();}publicoverrideboolReadAttributeValue(){return_me.ReadAttributeValue();}publicoverrideboolRead(){boolres=_me.Read();Xml+=StringView();返回资源;}publicoverrideboolEOF{get{return_me.EOF;}}publicoverridevoidClose(){_me.Close();}publicoverrideReadStateReadState{get{return_me.ReadState;}}publicoverrideXmlNameTableNameTable{get{return_me.NameTable;}}publicoverridestringLookupNamespace(stringprefix){return_me.LookupNamespace(prefix);}publicoverridevoidResolveEntity(){_me.ResolveEntity();}#endregionprotectedstringStringView(){stringresult="";如果(_me.NodeType==XmlNodeType.Element){结果="";}if(_me.NodeType==XmlNodeType.EndElement){result="";}if(_me.NodeType==XmlNodeType.Text||_me.NodeType==XmlNodeType.Whitespace){result=_me.Value;}if(_me.NodeType==XmlNodeType.XmlDeclaration){result="";}返回结果;}}公共类MyInfo:ConsoleApplication1.eu.dataaccess.footballpool.Info{protectedXmlReaderSpy_xmlReaderSpy;publicstringXml{get{if(_xmlReaderSpy!=null){return_xmlReaderSpy.Xml;}else{返回“”;}}}protectedoverrideXmlForMessGet(ReaderSystem.Web.Services.Protocols.SoapClientMessagemessage,intbufferSize){XmlReaderrdr=base.GetReaderForMessage(message,bufferSize);_xmlReaderSpy=newXmlReaderSpy((XmlReader)rdr);return_xmlReaderSpy;string[]args){MyInfo信息=newMyInfo();字符串[]rest=info.Cities();System.Console.WriteLine("RAWSoapXML响应:n"+info.Xml);System.Console.ReadLine();}}}受到jfburdet的启发,我想看看我是否可以直接拦截流/字节级别而不是重建XML它是!看到下面的代码:usingSystem;使用System.Collections.Generic;使用System.IO;使用System.Linq;使用系统文本;使用System.Web.Services.Protocols;使用System.Xml;使用Test.MyWebReference;namespaceTest{//////添加检索SOAP请求/响应的能力。///publicclassServiceSpy:OriginalService{privateStreamSpywriterStreamSpy;私有XmlTextWriterxmlWriter;私有StreamSpyreaderStreamSpy;私有XmlTextReaderxmlReader;publicMemoryStreamWriterStream{get{返回writerStreamSpy==null?空:writerStreamSpy.ClonedStream;}}publicXmlTextWriterXmlWriter{get{returnxmlWriter;}}publicMemoryStreamReaderStream{get{returnreaderStreamSpy==null?空:readerStreamSpy.ClonedStream;}}publicXmlTextReaderXmlReader{get{returnxmlReader;}}protectedoverridevoidDispose(booldisposing){base.Dispose(disposing);DisposeWriterStreamSpy();DisposeReaderStreamSpy();}受保护的爱rrideXmlWriterGetWriterForMessage(SoapClientMessagemessage,intbufferSize){//处理前一个writerstreamspy.DisposeWriterStreamSpy();writerStreamSpy=newStreamSpy(message.Stream);//XML应该始终支持UTF8。xmlWriter=newXmlTextWriter(writerStreamSpy,Encoding.UTF8);返回xmlWriter;}protectedoverrideXmlReaderGetReaderForMessage(SoapClientMessagemessage,intbufferSize){//处理前一个读取器流spy.DisposeReaderStreamSpy();readerStreamSpy=newStreamSpy(message.Stream);xmlReader=newXmlTextReader(readerStreamSpy);返回xmlReader;}privatevoidDisposeWriterStreamSpy(){if(writerStreamSpy!=null){writerStreamSpy.Dispose();writerStreamSpy.ClonedStream.Dispose();writerStreamSpy=null;}}privatevoidDisposeReaderStreamSpy(){if(readerStreamSpy!=null){readerStreamSpy.Dispose();readerStreamSpy.ClonedStream.Dispose();readerStreamSpy=null;}}//////克隆读/写的包装类项目字节。///publicclassStreamSpy:Stream{privateStreamwrappedStream;私人长开始位置;privateMemoryStreamclonedStream=newMemoryStream();publicStreamSpy(StreamwrappedStream){this.wrappedStream=wrappedStream;startPosition=wrappedStream.Position;}publicMemoryStreamClonedStream{get{returnclonedStream;}}publicoverrideboolCanRead{get{returnwrappedStream.CanRead;}}publicoverrideboolCanSeek{get{returnwrappedStream.CanSeek;}}publicoverrideboolCanWrite{get{returnwrappedStream.CanWrite;}}publicoverridevoidFlush(){wrappedStream.Flush();}publicoverridelongLength{get{returnwrappedStream.Length;}}publicoverridelongPosition{get{returnwrappedStream.Position;}set{wrappedStream.Position=value;}}publicoverrideintRead(byte[]buffer,intoffset,intcount){longrelativeOffset=wrappedStream.Position-startPosition;int结果=wrappedStream.Read(缓冲区、偏移量、计数);if(clonedStream.Position!=relativeOffset){clonedStream.Position=relativeOffset;}clonedStream.Write(缓冲区,偏移量,结果);返回结果;}publicoverridelongSeek(longoffset,SeekOriginorigin){returnwrappedStream.Seek(offset,origin);}publicoverridevoidSetLength(longvalue){wrappedStream.SetLength(value);}publicoverridevoidWrite(byte[]buffer,intoffset,intcount){longrelativeOffset=wrappedStream.Position-startPosition;wrappedStream.Write(缓冲区,偏移量,计数);if(clonedStream.Position!=relativeOffset){clonedStream.Position=relativeOffset;}clonedStream.Write(缓冲区,偏移量,计数);}publicoverridevoidClose(){wrappedStream.Close();基地.关闭();}protectedoverridevoidDispose(booldisposing){if(wrappedStream!=null){wrappedStream.Dispose();wrappedStream=null;}base.Dispose(处理);}}}}MSDNLibrary包含用于获取请求和响应的XML的示例代码,您可以使用它来存储它显然,由于该示例将数据存储在文本文件中,因此您必须进行一些更改,但这并不太复杂。以上就是《C#学习教程:如何访问SOAP响应共享》。如果对你有用,需要进一步了解《C#学习教程》,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: