![]() |
1
3
我在“soapextension msdn”上的谷歌搜索中发现了这个问题(它还发现了示例代码为top hit的文档),所以这里有一些有用的建议,可以帮助其他人理解在编写soap extensions时有时令人困惑或矛盾的文档。 如果要修改序列化消息(作为流),则需要创建并返回一个不同于chainstream重写的流。否则,您的意思是扩展不修改流,只让它通过。这个例子使用了一个memorystream,这可能是由于奇怪的设计而必须使用的:当调用chainstream时,您不知道是发送还是接收,因此您必须准备好以任何方式处理它。我认为,即使您只在一个方向上处理它,您仍然必须处理另一个方向,并将数据从一个流复制到另一个流,因为您在不知道它是哪种方式的情况下将自己插入到链中。
然后,您必须在processmessage中处理afterserialize和beforereserialize案例。我让他们分别调用processTransmitstream(message)和processReceivedstream(message),以帮助保持流程清晰。 processTransmitstream从accessstream获取其输入(首先将此memoryStream的position重置为0之后),并将其输出写入到transportStream,这可能会允许非常有限的访问(无搜索等),因此我建议先将处理过程复制到本地memoryStream缓冲区,然后将其复制(将其position重置为0之后)到\u trans端口流。(或者,如果您将其处理成字节数组或字符串,则可以直接将其写入到cTransportStream。我的用例是压缩/解压,所以我倾向于将其全部作为流处理。) processReceivedStream从TransportStream获取其输入并将其输出写入accessStream。在这种情况下,您应该首先将_transportstream复制到本地memorystream缓冲区(然后将缓冲区的位置重置为0),这样您可以更方便地访问它。(或者,如果您需要的话,您可以直接将整个TransportStream读取到字节数组或其他形式中。)请确保在返回之前重置accessStream.position=0,以便链中的下一个链接可以读取它。 这是为了更改序列化流。如果不更改流,则不应重写chain stream(从而将扩展从流处理链中去掉)。相反,您将在BeforeSerialize和/或AfterDeserialize阶段进行处理。在这些阶段中,您不修改或访问流,而是处理消息对象本身,例如在BeforeSerialize阶段向Message.Headers集合添加自定义SoapHeader。 SoapMessage类本身是抽象的,所以您真正得到的是SoapClientMessage或SoapServerMessage。文档说您在客户端得到了一个soapclientmessage,在服务器端得到了一个soapservermsage(在调试器中进行的实验应该能够确认或更正这一点)。在您可以访问的内容方面,它们看起来非常相似,但是您必须强制转换到正确的类型才能正确访问它;使用错误的类型将失败,并且为processmessage参数声明的基本soapmessage类型不会授予您访问所有内容的权限。 我还没有研究属性的东西(它不会是我正在编码的内容的一部分),所以我无法帮助使用这个部分。 |
![]() |
2
2
我在尝试写一个soapextension来记录我在soap级别的Web服务活动时遇到了这篇文章。此脚本经过测试,并在服务器端使用时将活动记录到文本文件中。不支持客户端。 只需将“c:\your destination directory”替换为要用于日志文件写入的实际目录即可。 这项工作花了我一整天的时间,所以我把它贴出来,希望别人不必这么做。
将此添加到服务器的web.config中。
|
![]() |
3
1
为了能够操作输出,您需要在
你还必须在
这是关于SOAP扩展的一个很好的理解: http://hyperthink.net/blog/inside-of-chainstream/ . 一定要阅读关于比OldStream和Newstream更好命名的评论。就我个人而言,称他们为wireleam和appstream,使事情对我更清楚。 |
![]() |
4
0
我获得SOAP扩展的唯一方法是从msdn示例开始,然后 让这个例子发挥作用 . 只有当它开始工作时,我才会一点一点地改变它,测试一路上的每一步,直到它完成我想要的。 这甚至可以告诉我我做错了什么,但对我来说,这永远都不足以让我记住下一次。不过,通常和溪流有关。 |
![]() |
user755806 · 从Rest服务返回JSON响应? 7 年前 |