Remotingbeispiel: Hosten in Internetinformationsdienste
Im folgenden Beispiel wird ein einfacher Webdienst mit einigen komplizierteren Aspekten implementiert. BinaryFormatter wird verwendet, da die Nutzlast kompakter ist und das System weniger Zeit zum Serialisieren und Deserialisieren des Streams benötigt. Wenn Internetinformationsdienste (Internet Information Services, IIS) zudem die integrierte Windows-Authentifizierung (auch als NTLM-Authentifizierung bezeichnet) verwendet, authentifiziert der Server den Client und gibt anschließend an den Client die von IIS authentifizierte Identität zurück. Schließlich können Sie den Webdienst schützen, indem Sie den URL in der Clientkonfigurationsdatei so ändern, dass "https" als Protokollschema verwendet wird, und IIS so konfigurieren, dass für das betreffende virtuelle Verzeichnis SSL-Verschlüsselung (Secure Sockets Layer) erforderlich ist. Dieser Prozess wird jedoch im Beispiel nicht dargestellt.
Warnung
.NET Framework Remoting führt standardmäßig keine Authentifizierung oder Verschlüsselung aus. Daher empfiehlt es sich, alle erforderlichen Schritte auszuführen, um die Identität von Clients und Servern vor der Remoteinteraktion eindeutig zu bestimmen. Da für die Ausführung von .NET Framework Remoting-Anwendungen die Berechtigung FullTrust erforderlich ist, könnte ein nicht autorisierter Client, dem der Zugriff auf den Server gewährt wurde, Code so ausführen, als ob er vollständig vertrauenswürdig wäre. Authentifizieren Sie stets die Endpunkte, und verschlüsseln Sie die Kommunikationsstreams, entweder durch Hosten der Remotetypen in IIS, oder indem Sie für diese Aufgabe ein benutzerdefiniertes Channelempfängerpaar erstellen.
So kompilieren Sie dieses Beispiel und führen es aus
Speichern Sie alle Dateien im Verzeichnis RemoteIIS.
Kompilieren Sie das gesamte Beispiel, indem Sie an der Eingabeaufforderung die folgenden Befehle eingeben:
csc /noconfig /t:library /r:System.Web.dll /out:ServiceClass.dll ServiceClass.cs
csc /noconfig /r:System.Runtime.Remoting.dll /r:System.dll /r:ServiceClass.dll Client.cs
Erstellen Sie das Unterverzeichnis \bin, und kopieren Sie die Datei
ServiceClass.dll
in dieses Verzeichnis.Erstellen Sie in IIS ein virtuelles Verzeichnis. Geben Sie für das virtuelle Verzeichnis den Alias HttpBinary an, und legen Sie das Quellverzeichnis auf das Verzeichnis RemoteIIS fest.
Legen Sie als Authentifizierungsmethode für dieses virtuelle Verzeichnis die integrierte Windows-Authentifizierung fest (früher als NTLM-Athentifizierung bezeichnet).
Stellen Sie sicher, dass IIS gestartet wurde. Geben Sie an der Eingabeaufforderung im Verzeichnis RemoteIIS den Befehl client ein.
Diese Anwendung wird auf einem einzelnen Computer oder über ein Netzwerk ausgeführt. Wenn Sie die Anwendung über ein Netzwerk ausführen möchten, müssen Sie "localhost" in der Clientkonfiguration durch den Namen des Remotecomputers ersetzen.
ServiceClass.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Web;
public interface IService{
DateTime GetServerTime();
string GetServerString();
}
// IService exists to demonstrate the possibility of publishing only the interface.
public class ServiceClass : MarshalByRefObject, IService{
private int InstanceHash;
public ServiceClass(){
InstanceHash = this.GetHashCode();
}
public DateTime GetServerTime(){
return DateTime.Now;
}
public string GetServerString(){
// Use the HttpContext to acquire what IIS thinks the client's identity is.
string temp = HttpContext.Current.User.Identity.Name;
if (temp == null || temp.Equals(string.Empty))
temp = "**unavailable**";
return "Hi there. You are being served by instance number: "
+ InstanceHash.ToString()
+ ". Your alias is: "
+ temp;
}
}
Web.config
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
mode="SingleCall" objectUri="SAService.rem"
type="ServiceClass, ServiceClass"/>
</service>
<channels>
<channel ref="http"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
Client.cs
using System;
using System.Collections;
using System.Diagnostics;
using System.Net;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Security.Principal;
public class Client{
public static void Main(string[] Args){
// Tells the system about the remote object and customizes the HttpChannel
// to use the binary formatter (which understands that base64 encoding is needed).
RemotingConfiguration.Configure("Client.exe.config");
// New proxy for the ServiceClass.
// If you publish only the IService interface, you must use Activator.GetObject.
ServiceClass service = new ServiceClass();
// Programmatically customizes the properties given to the channel. This sample uses the
// application configuration file.
// IDictionary Props = ChannelServices.GetChannelSinkProperties(service);
// Props["credentials"] = CredentialCache.DefaultCredentials;
// Reports the client identity name.
Console.WriteLine("ConsoleIdentity: " + WindowsIdentity.GetCurrent().Name);
// Writes what the server returned.
Console.WriteLine("The server says : " + service.GetServerString());
Console.WriteLine("Server time is: " + service.GetServerTime());
}
}
Client.exe.config
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" useDefaultCredentials="true" port="0">
<clientProviders>
<formatter
ref="binary"
/>
</clientProviders>
</channel>
</channels>
<client>
<wellknown
url="https://localhost:80/HttpBinary/SAService.rem"
type="ServiceClass, ServiceClass"
/>
</client>
</application>
</system.runtime.remoting>
</configuration>
Siehe auch
Konzepte
Konfiguration von Remoteanwendungen
Hosten von Remoteobjekten in Internetinformationsdienste