SdlChannelSink.ProcessMessage Method (IServerChannelSinkStack, IMessage, ITransportHeaders, Stream, IMessage, ITransportHeaders, Stream)


The .NET API Reference documentation has a new home. Visit the .NET API Browser on to see the new experience.

Requests message processing from the current sink.

Namespace:   System.Runtime.Remoting.MetadataServices
Assembly:  System.Runtime.Remoting (in System.Runtime.Remoting.dll)

[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, 
	Infrastructure = true)]
public ServerProcessing ProcessMessage(
	IServerChannelSinkStack sinkStack,
	IMessage requestMsg,
	ITransportHeaders requestHeaders,
	Stream requestStream,
	out IMessage responseMsg,
	out ITransportHeaders responseHeaders,
	out Stream responseStream


Type: System.Runtime.Remoting.Channels.IServerChannelSinkStack

A stack of channel sinks that called the current sink.

Type: System.Runtime.Remoting.Messaging.IMessage

The message that contains the request.

Type: System.Runtime.Remoting.Channels.ITransportHeaders

The headers that are retrieved from the incoming message from the client.

Type: System.IO.Stream

The stream that needs to be processed and passed on to the deserialization sink.

Type: System.Runtime.Remoting.Messaging.IMessage

When this method returns, contains a IMessage that holds the response message. This parameter is passed uninitialized.

Type: System.Runtime.Remoting.Channels.ITransportHeaders

When this method returns, contains a ITransportHeaders that holds the headers to add to return message heading to the client. This parameter is passed uninitialized.

Type: System.IO.Stream

When this method returns, contains a Stream that is heading to the transport sink. This parameter is passed uninitialized.

Return Value

Type: System.Runtime.Remoting.Channels.ServerProcessing

A ServerProcessing status value that provides information about how the message was processed.

The proxy's job is to convert a method call that is invoked on it into a message object. The Message object, which implements the IMessage interface, is passed from the client end to the server end by invoking ProcessMessage on message sink objects. Message sinks are chained together, which means that every message sink is responsible for calling ProcessMessage on the next message sink after it has performed its work. For instance, a synchronization-related message sink might cause a lock to be acquired or released and delegated to the downstream message sink.

When the formatter channel sink gets a message that needs to be sent over the channel, it calls SyncProcessMessage, passing the message as a parameter. The formatter sink then creates the transport header array and calls GetRequestStream on the formatter sink. This call is forwarded down the sink chain, and any sink can create a request stream that is passed back to the formatter sink. After this call returns, the message is serialized, ProcessMessage is called on the first chain in the sink chain, and the message is passed to the channel sinks.

After the channel sinks get the message, they can write data to the stream, add headers to the header array, and add themselves to the sink stack before forwarding the call to the next sink. When the call reaches the transport sink at the end of the chain, the transport sink sends the headers and serialized message over the channel to the server, where the process is reversed.

When the message reaches the server side, the transport sink retrieves the headers and serialized message from the stream and forwards these through the sink chain until they reach the formatter sink. The formatter sink then deserializes the message and forwards it to remoting, where the message is turned into a method call and the server object is called.

.NET Framework
Available since 1.1
Return to top