IClientChannelSink Interfaccia
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Fornisce le funzioni e le proprietà richieste per i sink di canale del client.
public interface class IClientChannelSink : System::Runtime::Remoting::Channels::IChannelSinkBase
public interface IClientChannelSink : System.Runtime.Remoting.Channels.IChannelSinkBase
[System.Runtime.InteropServices.ComVisible(true)]
public interface IClientChannelSink : System.Runtime.Remoting.Channels.IChannelSinkBase
type IClientChannelSink = interface
interface IChannelSinkBase
[<System.Runtime.InteropServices.ComVisible(true)>]
type IClientChannelSink = interface
interface IChannelSinkBase
Public Interface IClientChannelSink
Implements IChannelSinkBase
- Derivato
- Attributi
- Implementazioni
Esempio
Nell'esempio di codice seguente viene illustrata un'implementazione dell'interfaccia IClientChannelSink .
using namespace System::Runtime::InteropServices;
using namespace System;
using namespace System::Collections;
using namespace System::IO;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Messaging;
[System::Security::Permissions::PermissionSet(System::Security::
Permissions::SecurityAction::Demand, Name = "FullTrust")]
public ref class ClientSink: public BaseChannelSinkWithProperties, public IClientChannelSink
{
private:
// This class inherits from BaseChannelSinkWithPropertes
// to get an implementation of IChannelSinkBase.
// The next sink in the chain.
IClientChannelSink^ nextSink;
public:
property IClientChannelSink^ NextChannelSink
{
virtual IClientChannelSink^ get()
{
return (nextSink);
}
}
virtual Stream^ GetRequestStream( IMessage^ message, ITransportHeaders^ requestHeaders )
{
// Get the request stream from the next sink in the chain.
return (nextSink->GetRequestStream( message, requestHeaders ));
}
virtual 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;
IEnumerator^ myEnum = dictionary->Keys->GetEnumerator();
while ( myEnum->MoveNext() )
{
Object^ key = safe_cast<Object^>(myEnum->Current);
Console::WriteLine( "{0} = {1}", key, dictionary[ key ] );
}
Console::WriteLine( "---------------------------------" );
// Hand off to the next sink in the chain.
nextSink->ProcessMessage( message, requestHeaders, requestStream, responseHeaders, responseStream );
}
// For synchronous remoting, it is not necessary to implement this method.
virtual void AsyncProcessRequest( IClientChannelSinkStack^ /*sinkStack*/, IMessage^ /*message*/, ITransportHeaders^ /*requestHeaders*/, Stream^ /*requestStream*/ )
{
throw gcnew NotImplementedException;
}
virtual void AsyncProcessResponse( IClientResponseChannelSinkStack^ /*sinkStack*/, Object^ /*state*/, ITransportHeaders^ /*responseHeaders*/, Stream^ /*responseStream*/ )
{
throw gcnew NotImplementedException;
}
property System::Collections::IDictionary^ Properties
{
virtual System::Collections::IDictionary^ get() override
{
return (dynamic_cast<BaseChannelSinkWithProperties^>(this))->Properties;
}
}
// Constructor
ClientSink( IClientChannelSink^ sink )
{
if ( sink == nullptr )
throw gcnew ArgumentNullException( "sink" );
nextSink = sink;
}
};
using System;
using System.Collections;
using System.IO;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
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
{
get
{
return(nextSink);
}
}
public Stream GetRequestStream (IMessage message, ITransportHeaders requestHeaders)
{
// Get the request stream from the next sink in the chain.
return( nextSink.GetRequestStream(message, requestHeaders) );
}
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.
public void AsyncProcessRequest (IClientChannelSinkStack sinkStack,
IMessage message,
ITransportHeaders requestHeaders,
Stream requestStream)
{
throw new NotImplementedException();
}
public void AsyncProcessResponse (IClientResponseChannelSinkStack sinkStack,
Object state,
ITransportHeaders responseHeaders,
Stream responseStream)
{
throw new NotImplementedException();
}
// Constructor
public ClientSink (IClientChannelSink sink) {
if (sink == null) throw new ArgumentNullException("sink");
nextSink = sink;
}
}
Vedere la documentazione dell'interfaccia IClientChannelSinkProvider per un esempio dell'implementazione del provider del sink client corrispondente.
Commenti
I sink di canale forniscono un punto plug-in che consente l'accesso ai messaggi sottostanti che passano attraverso il canale e il flusso usato dal meccanismo di trasporto per inviare messaggi a un oggetto remoto. I sink di canale sono collegati in una catena di provider di sink di canale e tutti i messaggi di canale vengono trasmessi attraverso questa catena di sink prima di essere serializzati e trasportati.
Proprietà
NextChannelSink |
Ottiene il sink di canale del client successivo nella catena di sink del client. |
Properties |
Ottiene un dizionario tramite il quale è possibile accedere alle proprietà sul sink. (Ereditato da IChannelSinkBase) |
Metodi
AsyncProcessRequest(IClientChannelSinkStack, IMessage, ITransportHeaders, Stream) |
Richiede l'elaborazione asincrona di una chiamata di metodo sul sink corrente. |
AsyncProcessResponse(IClientResponseChannelSinkStack, Object, ITransportHeaders, Stream) |
Richiede l'elaborazione asincrona di una risposta a una chiamata di metodo sul sink corrente. |
GetRequestStream(IMessage, ITransportHeaders) |
Restituisce l'oggetto Stream sul quale verrà serializzato il messaggio fornito. |
ProcessMessage(IMessage, ITransportHeaders, Stream, ITransportHeaders, Stream) |
Richiede l'elaborazione di messaggi da parte del sink corrente. |