Export (0) Print
Expand All

IClientChannelSink Interface

Provides required functions and properties for client channel sinks.

Namespace: System.Runtime.Remoting.Channels
Assembly: mscorlib (in mscorlib.dll)

[ComVisibleAttribute(true)] 
public interface IClientChannelSink : IChannelSinkBase
/** @attribute ComVisibleAttribute(true) */ 
public interface IClientChannelSink extends IChannelSinkBase
ComVisibleAttribute(true) 
public interface IClientChannelSink extends IChannelSinkBase
Not applicable.

Channel sinks provide a plug-in point that allows access to the underlying messages flowing through the channel as well as the stream used by the transport mechanism to send messages to a remote object. Channel sinks are linked together in a chain of channel sink providers and all channel messages flow through this chain of sinks before they are serialized and transported.

The following code example illustrates an implementation of the IClientChannelSink interface.

using System;
using System.Collections;
using System.IO;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
using System.Security.Permissions;

public class ClientSink : BaseChannelSinkWithProperties, IClientChannelSink
{

    // This class inherits from BaseChannelSinkWithPropertes
    // to get an implementation of IChannelSinkBase.


    // The next sink in the chain.
    private IClientChannelSink nextSink;

    public IClientChannelSink NextChannelSink
    {
        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
        get
        {
            return(nextSink);
        }
    }

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
    public Stream GetRequestStream (IMessage message, ITransportHeaders requestHeaders)
    {
        // Get the request stream from the next sink in the chain.
        return( nextSink.GetRequestStream(message, requestHeaders) );
    }

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
    public void ProcessMessage (IMessage message,
                                ITransportHeaders requestHeaders,
                                Stream requestStream,
                                out ITransportHeaders responseHeaders,
                                out Stream responseStream)
    {
        // Print the request message properties.
        Console.WriteLine("---- Message from the client ----");
        IDictionary dictionary = message.Properties;
        foreach (Object key in dictionary.Keys)
        {
            Console.WriteLine("{0} = {1}", key, dictionary[key]);
        }
        Console.WriteLine("---------------------------------");

        // Hand off to the next sink in the chain.
        nextSink.ProcessMessage(message, requestHeaders, requestStream, out responseHeaders, out responseStream);
    } 

    // For synchronous remoting, it is not necessary to implement this method.
    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
    public void AsyncProcessRequest (IClientChannelSinkStack sinkStack,
                                     IMessage message,
                                     ITransportHeaders requestHeaders,
                                     Stream requestStream)
    {
        throw new NotImplementedException();
    }

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
    public void AsyncProcessResponse (IClientResponseChannelSinkStack sinkStack,
                                      Object state,
                                      ITransportHeaders responseHeaders,
                                      Stream responseStream)
    {
        throw new NotImplementedException();
    }


    // Constructor
    [SecurityPermission(SecurityAction.LinkDemand)]
    public ClientSink (IClientChannelSink sink) {
      if (sink == null) throw new ArgumentNullException("sink");
      nextSink = sink;
    }

}

import System.*;
import System.Collections.*;
import System.IO.*;
import System.Runtime.Remoting.Channels.*;
import System.Runtime.Remoting.Messaging.*;
import System.Security.Permissions.*;

/** @attribute SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)
*/
public class ClientSink extends BaseChannelSinkWithProperties
    implements IClientChannelSink
{
    // This class inherits from BaseChannelSinkWithPropertes
    // to get an implementation of IChannelSinkBase.
    // The next sink in the chain.
    private IClientChannelSink nextSink;

    /** @property 
     */
    public IClientChannelSink get_NextChannelSink()
    {
        return nextSink;
    }//get_NextChannelSink

    public Stream GetRequestStream(IMessage message, 
        ITransportHeaders requestHeaders)
    {
        // Get the request stream from the next sink in the chain.
        return nextSink.GetRequestStream(message, requestHeaders);
    } //GetRequestStream

    public void ProcessMessage(IMessage message, ITransportHeaders requestHeaders, 
        Stream requestStream, /** @ref */ ITransportHeaders responseHeaders,
        /** @ref */ Stream responseStream)
    {
        // Print the request message properties.
        Console.WriteLine("---- Message from the client ----");
        IDictionary dictionary = message.get_Properties();
        Object key = null;
        IEnumerator objEnum = dictionary.get_Keys().GetEnumerator();
        while (objEnum.MoveNext()) {
            key = objEnum.get_Current();
            Console.WriteLine("{0} = {1}", key, dictionary.get_Item(key));
        }
        Console.WriteLine("---------------------------------");
        // Hand off to the next sink in the chain.
        nextSink.ProcessMessage(message, requestHeaders, requestStream,
            responseHeaders, responseStream);
    } //ProcessMessage

    // For synchronous remoting, it is not necessary to implement this method.
    public void AsyncProcessRequest(IClientChannelSinkStack sinkStack,
        IMessage message, ITransportHeaders requestHeaders, Stream requestStream)
        throws NotImplementedException
    {
        throw new NotImplementedException();
    } //AsyncProcessRequest

    public void AsyncProcessResponse(IClientResponseChannelSinkStack sinkStack, 
        Object state, ITransportHeaders responseHeaders, Stream responseStream) 
        throws  NotImplementedException
    {
        throw new NotImplementedException();
    } //AsyncProcessResponse

    // Constructor
    public ClientSink(IClientChannelSink sink)
    {
        if (sink == null) {
            throw new ArgumentNullException("sink");
        }
        nextSink = sink;
    } //ClientSink
} //ClientSink

See the IClientChannelSinkProvider interface documentation for an example of the corresponding client sink provider implementation.

Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.

.NET Framework

Supported in: 3.0, 2.0, 1.1, 1.0

Community Additions

ADD
Show:
© 2014 Microsoft