public class HttpChannel : BaseChannelWithProperties, IChannelReceiver, IChannel, IChannelSender, IChannelReceiverHook
|
Channels transport messages between applications across remoting boundaries (for example application domains, processes, and machines). These crossings include both inbound and outbound. The current channel listens on an endpoint for inbound messages and sends the outbound messages to the endpoint. The HttpChannel converts the messages sent along it to and from the XML format, receiving and sending them using the HTTP protocol.
On the client side, messages are handed off to the client channel sink chain after they traverse the client Context chain. The first channel sink is typically an IClientFormatterSink which serializes the message into a stream that is passed down the channel sink chain to the client transport sink. The client transport sink then writes this stream out to the wire.
On the server side, the server transport sink reads requests off of the wire and passes the request stream to the server channel sink chain. The server formatter sink at the end of this chain will deserialize the request into a message. It will then hand this message off to the Remoting infrastructure which will dispatch it to the server Context chain.
IChannel implementations use channel configuration properties to configure the channel at run time. Channel properties can be specified in a configuration file, or programmatically, inside of an IDictionary. In a configuration file all values are represented by strings, but when building a property IDictionary programatically, value types can be specified with their native values or with strings.
The following table shows the channel configuration properties that can be specified for the current channel.
Property | Description |
---|---|
name | Indicates the name of the channel. This property is used to retrieve a specific channel when calling ChannelServices.GetChannel . If this property is not set, the system defaults to "http". If you want to register more than one HttpChannel , each must have a unique name. Set this property to the String.Empty string ("") if you want to ignore names, but avoid naming collisions. The system will allow any number of channels with the String.Empty name. |
priority | An integer representing the priority assigned to this channel. Higher numbers indicate a higher chance of being chosen to connect first. The default priority is 1, and negative numbers are allowed. |
clientConnectionLimit | An integer indicating how many connections can be simultaneously opened to a given server. The default is 2. |
proxyName | The name of the proxy computer. |
proxyPort | An integer specifying the proxy port. |
port | An integer specifying the port on which the channel will listen. |
supressChannelData | true or false . Specifies that the channel will not contribute to the HttpChannel.ChannelData . |
useIpAddress | true or false . Specifies whether the channel shall use the IP address in the publication URL instead of the computer name. |
listen | true or false . Specifies whether to allow activation to hook into the outside listener service. |
bindTo | An IP address resolving to the current computer that specifies which NIC to bind the current channel to. |
machineName | A string that specifies the machine name used with the current channel. Overrides the useIpAddress configuration property and the machine name channel data. |
ctor #1 | Overloaded:.ctor() Default constructor. This constructor is called by derived class constructors to initialize state in this type.Initializes a new instance of the HttpChannel class, activating the client and server channels with default values. |
ctor #2 | Overloaded:.ctor(int port) Initializes a new instance of the HttpChannel class, activating the underlying HttpServerChannel on the specified port. |
ctor #3 | Overloaded:.ctor(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider) Initializes a new instance of the HttpChannel class with the given channel properties and specified IClientChannelSinkProvider and IServerChannelSinkProvider. |
ChannelData | Read-only Gets the channel-specific data. |
ChannelName | Read-only Gets the name of the current channel. |
ChannelPriority | Read-only Returns the priority of the current channel. |
ChannelScheme | Read-only Gets the type of listener to hook into (for example "http"). |
ChannelSinkChain | Read-only Gets the channel sink chain that the current channel is using. |
Count (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
Read-only See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.Count Gets the number of properties associated with the current channel object. |
IsFixedSize (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
Read-only See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.IsFixedSize Gets a Boolean value indicating whether the number of properties that can be entered into the current channel object is fixed. |
IsReadOnly (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
Read-only See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.IsReadOnly Gets a Boolean value indicating whether the collection of properties in the current channel object is read-only. |
IsSynchronized (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
Read-only See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.IsSynchronized Gets a value indicating whether the current dictionary of channel object properties is synchronized. |
Item | Read-write Overridden: Gets or sets a channel property associated with the specified key. |
Keys | Read-only Overridden: Gets an ICollection of keys with which the channel properties are associated. |
Properties | Read-only Overridden: Gets an IDictionary of the channel properties associated with the current channel. |
SyncRoot (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
Read-only See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.SyncRoot Gets an object that is used to synchronize access to the BaseChannelObjectWithProperties. |
Values (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
Read-only See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.Values Gets an ICollection of the values of the properties associated with the current channel object. |
WantsToListen | Read-write Gets a Boolean value indicating whether the current instance wants to be hooked into the outside listener service. |
Add (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.Add The current method must not be implemented because it does not apply to the way IDictionary is being used in this case, and because BaseChannelObjectWithProperties.IsFixedSize returns true. |
AddHookChannelUri | Adds a URI on which the channel hook should listen. |
Clear (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.Clear The current method must not be implemented because it does not apply to the way IDictionary is being used in this case, and because BaseChannelObjectWithProperties.IsFixedSize returns true. |
Contains (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.Contains Returns a Boolean value indicating whether the current channel object contains a property associated with the specified key. |
CopyTo (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.CopyTo The current method is not supported by the BaseChannelObjectWithProperties. |
CreateMessageSink | Returns a channel message sink that delivers messages to the specified URL or channel data object. |
Equals (inherited from System.Object) |
See base class member description: System.Object.Equals Derived from System.Object, the primary base class for all objects. |
GetEnumerator (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.GetEnumerator Returns an IDictionaryEnumerator that enumerates over all the properties associated with the current channel object. |
GetHashCode (inherited from System.Object) |
See base class member description: System.Object.GetHashCode Derived from System.Object, the primary base class for all objects. |
GetType (inherited from System.Object) |
See base class member description: System.Object.GetType Derived from System.Object, the primary base class for all objects. |
GetUrlsForUri | Returns an array of all the URLs for an object with the specified URI, hosted on the current HttpChannel. |
Parse | Extracts the channel URI and the remote well known object URI from the specified URL. |
Remove (inherited from System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties.Remove The current method must not be implemented because it does not apply to the way IDictionary is being used in this case, and because BaseChannelObjectWithProperties.IsFixedSize returns true. |
StartListening | Instructs the current channel to start listening for requests. |
StopListening | Instructs the current channel to stop listening for requests. |
ToString (inherited from System.Object) |
See base class member description: System.Object.ToString Derived from System.Object, the primary base class for all objects. |
SinksWithProperties (inherited from System.Runtime.Remoting.Channels.BaseChannelWithProperties) |
See base class member description: System.Runtime.Remoting.Channels.BaseChannelWithProperties.SinksWithProperties Indicates the top channel sink in the channel sink stack. |
Finalize (inherited from System.Object) |
See base class member description: System.Object.Finalize Derived from System.Object, the primary base class for all objects. |
MemberwiseClone (inherited from System.Object) |
See base class member description: System.Object.MemberwiseClone Derived from System.Object, the primary base class for all objects. |
Hierarchy:
public HttpChannel(); |
public HttpChannel( |
port
public HttpChannel( |
properties
clientSinkProvider
serverSinkProvider
Exception Type | Condition |
---|---|
ArgumentException | The provided channel properties are not in the correct format. |
When the IClientChannelSinkProvider.CreateSink method is called on a sink provider, it should create its own channel sink, forward the CreateSink call to the next sink provider in the chain, and ensure that the next sink and the current one are linked together. The provider then returns its sink to the caller. Channel sinks are responsible for forwarding all calls made on them to the next sink in the chain.
ListDictionary channelProperties = new ListDictionary(); channelProperties.Add("port", 9000); HttpChannel channel = new HttpChannel(channelProperties, new SoapClientFormatterSinkProvider(), new SoapServerFormatterSinkProvider()); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleService), "MySampleService/SampleService.soap", WellKnownObjectMode.Singleton); Console.WriteLine("** Press enter to end the server process. **"); Console.ReadLine();
protected IChannelSinkBase SinksWithProperties;
|
public object ChannelData {get;}
|
public string ChannelName {get;}
|
public int ChannelPriority {get;}
|
public string ChannelScheme {get;}
|
public IServerChannelSink ChannelSinkChain {get;}
|
public virtual int Count {get;}
|
public virtual bool IsFixedSize {get;}
|
public virtual bool IsReadOnly {get;}
|
public virtual bool IsSynchronized {get;}
|
public override object this[object key] {get; set;}
|
key
System.Runtime.Remoting.Channels.Http.HttpChannel channel = new System.Runtime.Remoting.Channels.Http.HttpChannel(8085); string proxyName = channel["proxyname"].ToString(); string proxyPort = channel["proxyport"].ToString(); System.Console.WriteLine("proxyname = {0}", proxyName); System.Console.WriteLine("proxyport = {0}", proxyPort);
public override ICollection Keys {get;}
|
public override IDictionary Properties {get;}
|
public virtual object SyncRoot {get;}
|
public virtual ICollection Values {get;}
|
public bool WantsToListen {get; set;}
|
System.Runtime.Remoting.Channels.Http.HttpChannel channelWithPort = new System.Runtime.Remoting.Channels.Http.HttpChannel(8085); System.Runtime.Remoting.Channels.Http.HttpChannel channelNoPort = new System.Runtime.Remoting.Channels.Http.HttpChannel(); // channelWithPort.WantsToListen is false. It is already listening. if (channelWithPort.WantsToListen) { System.Console.WriteLine("channelWithPort wants to listen."); } else { System.Console.WriteLine( "channelWithPort doesn't want to listen."); } // channelNoPort.WantsToListen is true. if (channelNoPort.WantsToListen) { System.Console.WriteLine("channelNoPort wants to listen."); } else { System.Console.WriteLine( "channelNoPort doesn't want to listen."); }
key
value
Exception Type | Condition |
---|---|
NotSupportedException | The method was called. |
public void AddHookChannelUri( |
channelUri
class CustomChannel : BaseChannelWithProperties, IChannelReceiverHook, IChannelReceiver, IChannel, IChannelSender { public void AddHookChannelUri(string channelUri) { if (channelUri != null) { string [] uris = dataStore.ChannelUris; // This implementation only allows one URI to be hooked in. if (uris == null) { string [] newUris = new string[1]; newUris[0] = channelUri; dataStore.ChannelUris = newUris; wantsToListen = false; } else { string msg = "This channel is already listening for " + "data, and can't be hooked into at this stage."; throw new System.Runtime.Remoting.RemotingException(msg); } } } // The rest of CustomChannel's implementation.
public virtual void Clear(); |
Exception Type | Condition |
---|---|
NotSupportedException | The method was called. |
key
array
index
Exception Type | Condition |
---|---|
NotSupportedException | The method was called. |
public IMessageSink CreateMessageSink( |
url
remoteChannelData
objectURI
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 ChannelSinkProviders and all channel messages flow through this chain of sinks before the message is finally serialized and transported.
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using System.Runtime.Remoting.Messaging; class Class1 { static void Main() { // Create a remotable object. HttpChannel channel = new HttpChannel(8085); ChannelServices.RegisterChannel(channel); WellKnownServiceTypeEntry WKSTE = new WellKnownServiceTypeEntry(typeof(HelloService), "Service", WellKnownObjectMode.Singleton); RemotingConfiguration.RegisterWellKnownServiceType(WKSTE); RemotingConfiguration.ApplicationName = "HelloServer"; // Create a message sink for TempConverter. string objURI; IMessageSink sink = channel.CreateMessageSink("http://localhost:8085/HelloServer", channel, out objURI); // Do processing on messsage sink... Console.WriteLine("Press <enter> to exit"); Console.ReadLine(); } }
~HttpChannel(); |
public virtual IDictionaryEnumerator GetEnumerator(); |
public virtual int GetHashCode(); |
public Type GetType(); |
objectURI
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels.Http; class Class1 { public static void Main() { // Create a remotable object. HttpChannel httpChannel = new HttpChannel(8085); WellKnownServiceTypeEntry WKSTE = new WellKnownServiceTypeEntry(typeof(HelloService), "Service", WellKnownObjectMode.Singleton); RemotingConfiguration.RegisterWellKnownServiceType(WKSTE); RemotingConfiguration.ApplicationName = "HelloServer"; // Print out the urls for HelloServer. string[] urls = httpChannel.GetUrlsForUri("HelloServer"); foreach (string url in urls) System.Console.WriteLine("{0}", url); } }
protected object MemberwiseClone(); |
url
objectURI
public virtual void Remove( |
key
Exception Type | Condition |
---|---|
NotSupportedException | The method was called. |
public void StartListening( |
data
public void StopListening( |
data
public virtual string ToString(); |