.NET Framework Class Library  

BaseChannelObjectWithProperties Class

Provides a base implementation of a channel object that wants to provide a dictionary interface to its properties.

For a list of all members of this type, see BaseChannelObjectWithProperties Members.

System.Object
   System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties
      System.Runtime.Remoting.Channels.BaseChannelSinkWithProperties
      System.Runtime.Remoting.Channels.BaseChannelWithProperties

[Visual Basic]
MustInherit Public Class BaseChannelObjectWithProperties
   Implements IDictionary, ICollection, IEnumerable
[C#]
public abstract class BaseChannelObjectWithProperties :
   IDictionary, ICollection, IEnumerable
[C++]
public __gc __abstract class BaseChannelObjectWithProperties :
   public IDictionary, ICollection, IEnumerable
[JScript]
public abstract class BaseChannelObjectWithProperties implements
   IDictionary, ICollection, IEnumerable

Thread Safety

Any public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Any instance members are not guaranteed to be thread safe.

Remarks

BaseChannelObjectWithProperties is the base class for BaseChannelWithProperties and BaseChannelSinkWithProperties. BaseChannelWithProperties and BaseChannelSinkWithProperties can be used as the base classes for channels and channel sinks that want to provide named properties.

BaseChannelObjectWithProperties handles the complex task of asking a channel object for its properties.

Note   This class makes a link demand and an inheritance demand at the class level. A SecurityException is thrown when either the immediate caller or the derived class does not have infrastructure permission. For details about security demands, see Link Demands and Inheritance Demands.

Notes to Inheritors:  When you inherit from BaseChannelObjectWithProperties, you must override the Keys property and the Item property.

Example

[Visual Basic] 
Public Class LoggingServerChannelSinkProvider
   Implements IServerChannelSinkProvider 
   Private next2 As IServerChannelSinkProvider = Nothing
   
   Public Sub New(properties As IDictionary, providerData As ICollection)
   End Sub 'New
   
   Public Sub GetChannelData(channelData As IChannelDataStore) _ 
                               Implements IServerChannelSinkProvider.GetChannelData
   End Sub 'GetChannelData
   
   Public Function CreateSink(channel1 As IChannelReceiver) As IServerChannelSink _ 
                                     Implements IServerChannelSinkProvider.CreateSink
      Dim localNextSink As IServerChannelSink = Nothing
      If Not (next2 Is Nothing) Then
         localNextSink = next2.CreateSink(channel1)
      End If
      Return New LoggingServerChannelSink(localNextSink)
   End Function 'CreateSink
   
   Public Property [Next]() As IServerChannelSinkProvider Implements _ 
                                                     IServerChannelSinkProvider.Next
      Get
         Return next2
      End Get
      Set
         next2 = value
      End Set
   End Property
End Class 'LoggingServerChannelSinkProvider
 
Friend Class LoggingServerChannelSink
   Inherits BaseChannelObjectWithProperties
   Implements IServerChannelSink 
   Private nextSink2 As IServerChannelSink = Nothing
   Private bEnabled2 As Boolean = True
   
   Public Sub New(localNextSink As IServerChannelSink)
      MyBase.new()
      nextSink2 = localNextSink
   End Sub 'New
   
  Public Function ProcessMessage(   ByVal sinkStack As IServerChannelSinkStack, _
      ByVal requestMsg As IMessage, _
      ByVal requestHeaders As ITransportHeaders, _
      ByVal requestStream As Stream, _
      <Out> ByRef responseMsg As IMessage, _
      <Out> ByRef responseHeaders As ITransportHeaders, _
      <Out> ByRef responseStream As Stream _
   ) As ServerProcessing _ 
      Implements IServerChannelSink.ProcessMessage
      If bEnabled2 Then
         Console.WriteLine("----------Request Headers-----------")
         Console.WriteLine(CommonTransportKeys.IPAddress.ToString() + ":" + _ 
                              requestHeaders(CommonTransportKeys.IPAddress).ToString())
      Console.WriteLine(CommonTransportKeys.ConnectionId.ToString() + ":" + _ 
                              requestHeaders(CommonTransportKeys.ConnectionId).ToString())
      Console.WriteLine(CommonTransportKeys.RequestUri.ToString() + ":" + _ 
                              requestHeaders(CommonTransportKeys.RequestUri).ToString())
      End If
      sinkStack.Push(Me, Nothing)
      Dim processing As ServerProcessing = _ 
                                   nextSink2.ProcessMessage _ 
               (sinkStack, requestMsg, requestHeaders, requestStream, responseMsg, responseHeaders, responseStream)
      
      Select Case processing
         Case ServerProcessing.Complete
               sinkStack.Pop(Me)
         Case ServerProcessing.OneWay
               sinkStack.Pop(Me)
         Case ServerProcessing.Async
               sinkStack.Store(Me, Nothing)
      End Select
      Return processing
   End Function 'ProcessMessage
   
   Public Sub AsyncProcessResponse(sinkStack As IServerResponseChannelSinkStack, _ 
           state As Object, msg As IMessage, headers As ITransportHeaders, stream1 As Stream) _ 
                                    Implements IServerChannelSink.AsyncProcessResponse
      sinkStack.AsyncProcessResponse(msg, headers, stream1)
   End Sub 'AsyncProcessResponse
   
   Public Function GetResponseStream(sinkStack As IServerResponseChannelSinkStack, _ 
               state As Object, msg As IMessage, headers As ITransportHeaders) As Stream _ 
                                    Implements IServerChannelSink.GetResponseStream
      Return Nothing
   End Function 'GetResponseStream
   
   Public ReadOnly Property NextChannelSink() As IServerChannelSink _ 
                                       Implements IServerChannelSink.NextChannelSink
      Get
         Return nextSink2
      End Get
   End Property

   Public Overrides ReadOnly Property Properties() As Collections.IDictionary _ 
               Implements IServerChannelSink.Properties
      Get
      End Get
   End Property
End Class 'LoggingServerChannelSink

[C#] 
public class LoggingServerChannelSinkProvider : IServerChannelSinkProvider
{
   private IServerChannelSinkProvider next2 = null;
   public LoggingServerChannelSinkProvider(IDictionary properties, ICollection providerData)
   {
   }
   public void GetChannelData(IChannelDataStore channelData)
   {
   }
   public IServerChannelSink CreateSink(IChannelReceiver channel1)
   {
      IServerChannelSink localNextSink = null;
      if (next2 != null)
         localNextSink = next2.CreateSink(channel1);
      return new LoggingServerChannelSink(localNextSink);
   }
   public IServerChannelSinkProvider Next
   {
      get
      {
         return next2;
      }
      set
      {
         next2 = value;
      }
   }
}
internal class LoggingServerChannelSink : BaseChannelObjectWithProperties, IServerChannelSink
{
   private IServerChannelSink nextSink2 = null;
   private bool bEnabled2 = true;
   public LoggingServerChannelSink(IServerChannelSink localNextSink) : base()
   {
      nextSink2 = localNextSink;
   }
   public ServerProcessing ProcessMessage(   IServerChannelSinkStack sinkStack,
IMessage requestMsg,
ITransportHeaders requestHeaders,
Stream requestStream,
out IMessage responseMsg,
out ITransportHeaders responseHeaders,
out Stream responseStream
)
   {
      if (bEnabled2)
      {
         Console.WriteLine("----------Request Headers-----------");
         Console.WriteLine( CommonTransportKeys.IPAddress + ":" +
            requestHeaders[CommonTransportKeys.IPAddress]);
         Console.WriteLine( CommonTransportKeys.ConnectionId + ":" +
            requestHeaders[CommonTransportKeys.ConnectionId]);
         Console.WriteLine( CommonTransportKeys.RequestUri + ":" +
            requestHeaders[CommonTransportKeys.RequestUri]);

      }
      sinkStack.Push(this, null);
      ServerProcessing processing =
         nextSink2.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg,
         out responseHeaders, out responseStream);

      switch (processing)
      {
         case ServerProcessing.Complete :
         {
            sinkStack.Pop(this);
            break;
         }
         case ServerProcessing.OneWay:
         {
            sinkStack.Pop(this);
            break;
         }
         case ServerProcessing.Async:
         {
            sinkStack.Store(this, null);
            break;
         }
      }
      return processing;
   }
   public void AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, Object state,
      IMessage msg, ITransportHeaders headers, Stream stream1)
   {
      sinkStack.AsyncProcessResponse(msg, headers, stream1);
   }
   public Stream GetResponseStream(IServerResponseChannelSinkStack sinkStack, Object state,
      IMessage msg, ITransportHeaders headers)
   {
      return null;
   }
   public IServerChannelSink NextChannelSink
   {
      get
      {
         return nextSink2;
      }
   }
}

[C++, JScript] No example is available for C++ or JScript. To view a Visual Basic or C# example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Namespace: System.Runtime.Remoting.Channels

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

Assembly: Mscorlib (in Mscorlib.dll)

.NET Framework Security: 

See Also

BaseChannelObjectWithProperties Members | System.Runtime.Remoting.Channels Namespace