2 // System.Runtime.Remoting.Channels.SoapClientFormatterSink.cs
\r
4 // Authors: Rodrigo Moya (rodrigo@ximian.com)
\r
5 // Jean-Marc André (jean-marc.andre@polymtl.ca)
\r
7 // 2002 (C) Copyright, Ximian, Inc.
\r
10 using System.Collections;
\r
12 using System.Reflection;
\r
13 using System.Runtime.Remoting.Messaging;
\r
14 using System.Runtime.Serialization;
\r
15 using System.Runtime.Serialization.Formatters;
\r
16 using System.Runtime.Serialization.Formatters.Soap;
\r
18 namespace System.Runtime.Remoting.Channels
\r
20 public class SoapClientFormatterSink : IClientFormatterSink,
\r
21 IMessageSink, IClientChannelSink, IChannelSinkBase
\r
23 private IClientChannelSink _nextChannelSink;
\r
24 private SoapFormatter _serializationFormatter;
\r
25 private SoapFormatter _deserializationFormatter;
\r
27 public SoapClientFormatterSink (IClientChannelSink sink)
\r
29 _nextChannelSink = sink;
\r
30 RemotingSurrogateSelector surrogateSelector = new RemotingSurrogateSelector();
\r
31 StreamingContext context = new StreamingContext(StreamingContextStates.Remoting);
\r
32 _serializationFormatter = new SoapFormatter(surrogateSelector, context);
\r
33 _deserializationFormatter = new SoapFormatter(null, context);
\r
36 // IClientChannelSink
\r
37 public IClientChannelSink NextChannelSink
\r
40 return _nextChannelSink;
\r
45 public IMessageSink NextSink
\r
53 public IDictionary Properties
\r
60 public IMessageCtrl AsyncProcessMessage (IMessage msg,
\r
61 IMessageSink replySink)
\r
63 Stream requestStream;
\r
64 ITransportHeaders requestHeaders;
\r
65 SoapMessageFormatter soapMsgFormatter;
\r
67 SerializeMessage(msg, out requestStream, out requestHeaders, out soapMsgFormatter);
\r
69 ClientChannelSinkStack stack = new ClientChannelSinkStack(replySink);
\r
70 stack.Push(this, soapMsgFormatter);
\r
72 _nextChannelSink.AsyncProcessRequest(stack, msg, requestHeaders, requestStream);
\r
77 public void AsyncProcessRequest (IClientChannelSinkStack sinkStack,
\r
79 ITransportHeaders headers,
\r
82 // this method should never be called
\r
83 throw new NotSupportedException ();
\r
86 public void AsyncProcessResponse (IClientResponseChannelSinkStack sinkStack,
\r
88 ITransportHeaders headers,
\r
91 SoapMessageFormatter soapMsgFormatter = (SoapMessageFormatter)state;
\r
93 IMessage replyMessage = (IMessage) DeserializeMessage(stream, headers, (IMethodCallMessage)state, soapMsgFormatter);
\r
95 sinkStack.DispatchReplyMessage(replyMessage);
\r
99 public Stream GetRequestStream (IMessage msg,
\r
100 ITransportHeaders headers)
\r
102 // First sink in the chain so this method should never
\r
104 throw new NotSupportedException ();
\r
107 public void ProcessMessage (IMessage msg,
\r
108 ITransportHeaders requestHeaders,
\r
109 Stream requestStream,
\r
110 out ITransportHeaders responseHeaders,
\r
111 out Stream responseStream)
\r
113 // First sink in the chain so this method should never
\r
115 throw new NotSupportedException ();
\r
120 public IMessage SyncProcessMessage (IMessage msg)
\r
122 Stream requestStream, responseStream;
\r
123 ITransportHeaders requestHeaders, responseHeaders;
\r
124 SoapMessageFormatter soapMsgFormatter;
\r
126 SerializeMessage(msg, out requestStream, out requestHeaders, out soapMsgFormatter);
\r
127 _nextChannelSink.ProcessMessage(msg, requestHeaders, requestStream, out responseHeaders, out responseStream);
\r
129 return DeserializeMessage(responseStream, responseHeaders, (IMethodCallMessage)msg, soapMsgFormatter);
\r
133 private void SerializeMessage(IMessage msg, out Stream requestStream, out ITransportHeaders requestHeaders, out SoapMessageFormatter soapMsgFormatter) {
\r
134 SoapMessage soapMsg;
\r
135 soapMsgFormatter = new SoapMessageFormatter();
\r
136 soapMsg = soapMsgFormatter.BuildSoapMessageFromMethodCall((IMethodCallMessage) msg, out requestHeaders);
\r
138 // Get the stream where the message will be serialized
\r
139 requestStream = _nextChannelSink.GetRequestStream(msg, requestHeaders);
\r
141 if(requestStream == null) requestStream = new MemoryStream();
\r
143 // Serialize the message into the stream
\r
144 _serializationFormatter.Serialize(requestStream, soapMsg, null);
\r
146 if(requestStream is MemoryStream){
\r
147 requestStream.Position = 0;
\r
154 private IMessage DeserializeMessage(Stream responseStream, ITransportHeaders responseHeaders,IMethodCallMessage mcm, SoapMessageFormatter soapMsgFormatter) {
\r
155 SoapMessage rtnMessage = new SoapMessage();
\r
156 _deserializationFormatter.TopObject = rtnMessage;
\r
157 object objReturn = _deserializationFormatter.Deserialize(responseStream);
\r
159 return soapMsgFormatter.FormatResponse((ISoapMessage) objReturn, mcm);
\r