Freigeben über


HttpChannel-Klasse

Implementiert einen Clientchannel für Remoteaufrufe, der das HTTP-Protokoll zum Übertragen von Meldungen verwendet.

Namespace: System.Runtime.Remoting.Channels.Http
Assembly: System.Runtime.Remoting (in system.runtime.remoting.dll)

Syntax

'Declaration
Public Class HttpChannel
    Inherits BaseChannelWithProperties
    Implements IChannelReceiver, IChannelSender, IChannel, IChannelReceiverHook, _
    ISecurableChannel
'Usage
Dim instance As HttpChannel
public class HttpChannel : BaseChannelWithProperties, IChannelReceiver, IChannelSender, IChannel, 
    IChannelReceiverHook, ISecurableChannel
public ref class HttpChannel : public BaseChannelWithProperties, IChannelReceiver, IChannelSender, IChannel, 
    IChannelReceiverHook, ISecurableChannel
public class HttpChannel extends BaseChannelWithProperties implements IChannelReceiver, IChannelSender, 
    IChannel, IChannelReceiverHook, ISecurableChannel
public class HttpChannel extends BaseChannelWithProperties implements IChannelReceiver, IChannelSender, 
    IChannel, IChannelReceiverHook, ISecurableChannel

Hinweise

Channels transportieren Meldungen über Remotinggrenzen hinweg (z. B. zwischen Computern oder Anwendungsdomänen). Die HttpChannel-Klasse transportiert Meldungen mithilfe des HTTP-Protokolls.

Channels werden von der .NET Framework Remoting-Infrastruktur verwendet, um Remoteaufrufe zu transportieren. Wenn ein Client ein Remoteobjekt aufruft, wird der Aufruf in eine Meldung serialisiert, die von einem Clientchannel gesendet und von einem Serverchannel empfangen wird. Anschließend erfolgt die Deserialisierung und Verarbeitung. Alle zurückgegebenen Werte werden vom Serverchannel gesendet und vom Clientchannel empfangen.

Ein HttpChannel-Objekt verfügt über zugeordnete Konfigurationseigenschaften, die zur Laufzeit entweder in einer Konfigurationsdatei (durch Aufrufen der statischen RemotingConfiguration.Configure-Methode) oder programmgesteuert (durch das Übergeben einer IDictionary-Auflistung an den HttpChannel-Konstruktor) festgelegt werden können. Eine Liste mit diesen Konfigurationseigenschaften finden Sie unter Konfigurationseigenschaften für Channel und Formatierungsprogramme.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie ein HttpClientChannel verwendet wird, um einen Remotingserver und dessen Client einzurichten. Das Beispiel besteht aus drei Teilen:

  • Einem Server

  • Einem Client

  • Einem vom Server und vom Client verwendeten Remoteobjekt

Im folgenden Codebeispiel wird ein Server veranschaulicht.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

public class Server
{
    public static void Main(string[] args)
    {
        // Create the server channel.
        HttpServerChannel serverChannel = new HttpServerChannel(9090);

        // Register the server channel.
        ChannelServices.RegisterChannel(serverChannel);

        // Expose an object for remote calls.
        RemotingConfiguration.RegisterWellKnownServiceType(
            typeof(RemoteObject), "RemoteObject.rem", 
            WellKnownObjectMode.Singleton);

        // Wait for the user prompt.
        Console.WriteLine("Press ENTER to exit the server.");
        Console.ReadLine();
        Console.WriteLine("The server is exiting.");
    }
}
#using <System.dll>
#using <System.Runtime.Remoting.dll>
#using "common.dll"
using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Http;

void main()
{
   // Create the server channel.
   HttpServerChannel^ serverChannel = gcnew HttpServerChannel( 9090 );
   
   // Register the server channel.
   ChannelServices::RegisterChannel( serverChannel );
   
   // Expose an object for remote calls.
   RemotingConfiguration::RegisterWellKnownServiceType( RemoteObject::typeid, L"RemoteObject.rem", WellKnownObjectMode::Singleton );
   
   // Wait for the user prompt.
   Console::WriteLine( L"Press ENTER to exit the server." );
   Console::ReadLine();
   Console::WriteLine( L"The server is exiting." );
}

Im folgenden Codebeispiel wird ein Client für diesen Server veranschaulicht.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Security.Permissions;

public class Client
{
[SecurityPermission(SecurityAction.Demand)]
    public static void Main(string[] args)
    {
        // Create the channel.
        HttpClientChannel clientChannel = new HttpClientChannel();

        // Register the channel.
        ChannelServices.RegisterChannel(clientChannel);

        // Register as client for remote object.
        WellKnownClientTypeEntry remoteType = 
            new WellKnownClientTypeEntry(typeof(RemoteObject), 
            "https://localhost:9090/RemoteObject.rem");
        RemotingConfiguration.RegisterWellKnownClientType(remoteType);

        // Create a message sink.
        string objectUri;
        System.Runtime.Remoting.Messaging.IMessageSink messageSink = 
            clientChannel.CreateMessageSink(
            "https://localhost:9090/RemoteObject.rem", 
            null, out objectUri);
        Console.WriteLine(
            "The URI of the message sink is {0}.", 
            objectUri);
        if (messageSink != null)
        {
            Console.WriteLine("The type of the message sink is {0}.", 
                messageSink.GetType().ToString());
        }

        // Display the channel's properties using Keys and Item.
        foreach(string key in clientChannel.Keys)
        {
            Console.WriteLine(
                "clientChannel[{0}] = <{1}>", 
                key, clientChannel[key]);
        }

        // Parse the channel's URI.
        string objectUrl = "https://localhost:9090/RemoteObject.rem";
        string channelUri = clientChannel.Parse(objectUrl, out objectUri);
        Console.WriteLine("The object URL is {0}.", objectUrl);
        Console.WriteLine("The object URI is {0}.", objectUri);
        Console.WriteLine("The channel URI is {0}.", channelUri);

        // Create an instance of the remote object.
        RemoteObject service = new RemoteObject(); 

        // Invoke a method on the remote object.
        Console.WriteLine("The client is invoking the remote object.");
        Console.WriteLine("The remote object has been called {0} times.", 
            service.GetCount());
    }
}
#using <System.dll>
#using <System.Runtime.Remoting.dll>
#using "common.dll"

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Http;
void main()
{
   // Create the channel.
   HttpClientChannel^ clientChannel = gcnew HttpClientChannel;

   // Register the channel.
   ChannelServices::RegisterChannel( clientChannel );

   // Register as client for remote object.
   WellKnownClientTypeEntry^ remoteType = gcnew WellKnownClientTypeEntry( RemoteObject::typeid,L"https://localhost:9090/RemoteObject.rem" );
   RemotingConfiguration::RegisterWellKnownClientType( remoteType );

   // Create a message sink.
   String^ objectUri;
   System::Runtime::Remoting::Messaging::IMessageSink^ messageSink = clientChannel->CreateMessageSink( L"https://localhost:9090/RemoteObject.rem", nullptr,  objectUri );
   Console::WriteLine( L"The URI of the message sink is {0}.", objectUri );
   if ( messageSink != nullptr )
   {
      Console::WriteLine( L"The type of the message sink is {0}.", messageSink->GetType() );
   }

   // Display the channel's properties using Keys and Item.
   for each(String^ key in clientChannel->Keys)
   {
       Console::WriteLine("clientChannel[{0}] = <{1}>", key, clientChannel[key]);
   }

   // Parse the channel's URI.
   String^ objectUrl = L"https://localhost:9090/RemoteObject.rem";
   String^ channelUri = clientChannel->Parse( objectUrl,  objectUri );
   Console::WriteLine( L"The object URL is {0}.", objectUrl );
   Console::WriteLine( L"The object URI is {0}.", objectUri );
   Console::WriteLine( L"The channel URI is {0}.", channelUri );

   // Create an instance of the remote object.
   RemoteObject^ service = gcnew RemoteObject;
   
   // Invoke a method on the remote object.
   Console::WriteLine( L"The client is invoking the remote object." );
   Console::WriteLine( L"The remote object has been called {0} times.", service->GetCount() );
}

Im folgenden Codebeispiel wird das von Server und Client verwendete Remoteobjekt veranschaulicht.

using System;
using System.Runtime.Remoting;

// Remote object.
public class RemoteObject : MarshalByRefObject
{
    private int callCount = 0;

    public int GetCount()
    {
        Console.WriteLine("GetCount was called.");
        callCount++;
        return(callCount);
    }

}
#using <System.dll>
using namespace System;
using namespace System::Runtime::Remoting;

// Remote object.
public ref class RemoteObject: public MarshalByRefObject
{
private:
   static int callCount = 0;

public:
   int GetCount()
   {
      Console::WriteLine( L"GetCount was called." );
      callCount++;
      return (callCount);
   }

};

Vererbungshierarchie

System.Object
   System.Runtime.Remoting.Channels.BaseChannelObjectWithProperties
     System.Runtime.Remoting.Channels.BaseChannelWithProperties
      System.Runtime.Remoting.Channels.Http.HttpChannel

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 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

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

HttpChannel-Member
System.Runtime.Remoting.Channels.Http-Namespace

Weitere Ressourcen

Konfigurationseigenschaften für Channel und Formatierungsprogramme