IClientChannelSink Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет требуемые функции и свойства для приемников каналов клиента.
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
- Производный
- Атрибуты
- Реализации
Примеры
В следующем примере кода показана 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;
}
}
Пример реализации соответствующего поставщика приемника клиента см IClientChannelSinkProvider . в документации по интерфейсу.
Комментарии
Приемники каналов предоставляют точку подключаемого модуля, которая обеспечивает доступ к базовым сообщениям, проходящим через канал, а также к потоку, используемому механизмом транспорта для отправки сообщений в удаленный объект. Приемники каналов связаны между собой в цепочке поставщиков приемников каналов, и все сообщения канала проходят через эту цепочку приемников перед их сериализацией и транспортировкой.
Свойства
NextChannelSink |
Возвращает следующий приемник канала клиента в цепи приемников клиентов. |
Properties |
Возвращает словарь, через который осуществляется доступ к свойствам приемника. (Унаследовано от IChannelSinkBase) |
Методы
AsyncProcessRequest(IClientChannelSinkStack, IMessage, ITransportHeaders, Stream) |
Запрашивает асинхронную обработку вызова метода текущего приемника. |
AsyncProcessResponse(IClientResponseChannelSinkStack, Object, ITransportHeaders, Stream) |
Запрашивает асинхронную обработку ответа на метод вызова на текущем приемнике. |
GetRequestStream(IMessage, ITransportHeaders) |
Возвращает поток Stream, на котором упорядочивается обеспеченное сообщение. |
ProcessMessage(IMessage, ITransportHeaders, Stream, ITransportHeaders, Stream) |
Запрашивает обработку сообщения из текущего приемника. |