Ejemplo de interacción remota: Alojar en Servicios de Internet Information Server (IIS)
En el ejemplo siguiente se implementa un servicio Web básico con algunas complicaciones. Se utiliza el BinaryFormatter porque la carga es más compacta y el sistema emplea menos tiempo en serializar y deserializar la secuencia. Además, si Servicios de Internet Information Server (IIS) utiliza la autenticación de integrada de Windows (también denominada autenticación NTLM), el servidor autentica el cliente y, a continuación, devuelve al cliente la identidad que IIS ha podido autenticar. Por último, puede ayudar a proteger el servicio Web si cambia la dirección URL en el archivo de configuración del cliente para utilizar "https" como esquema de protocolo y configura IIS de manera que requiera el cifrado SSL (Secure Sockets Layer) para ese directorio virtual (en el ejemplo no se refleja este proceso).
Advertencia
.NET Framework Remoting no realiza autenticación ni cifrado de manera predeterminada. Por lo tanto, se recomienda que siga todos los procedimientos necesarios para asegurarse de la identidad de los clientes o servidores antes de interactuar con ellos de manera remota. Como las aplicaciones de .NET Framework Remoting requieren permisos FullTrust para ejecutarse, si se ha concedido acceso al servidor a un cliente no autorizado, éste podrá ejecutar código como si fuera de total confianza. Autentique siempre los extremos y cifre las secuencias de comunicación, ya sea alojando en IIS los tipos utilizados de forma remota o generando un par de receptores de canales personalizados para que se hagan cargo de este trabajo.
Para compilar y ejecutar este ejemplo
Guarde todos los archivos en un directorio denominado RemoteIIS.
Para compilar el ejemplo completo, escriba los siguientes comandos en el símbolo del sistema:
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
Cree un subdirectorio \bin y copie
ServiceClass.dll
en ese directorio.Cree un directorio virtual en IIS. Cree el alias del directorio virtual "HttpBinary" y establezca el directorio de origen en el directorio "RemoteIIS".
Establezca el método de autenticación de este directorio virtual en Autenticación integrada de Windows (anteriormente autenticación NTLM).
Asegúrese de que IIS se inicia; en el símbolo del sistema en el directorio "RemoteIIS", escriba client.
Esta aplicación se ejecuta en un único equipo o a través de una red. Si desea ejecutar esta aplicación a través de una red, debe reemplazar "localhost" en la configuración del cliente con el nombre del equipo remoto.
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>
Vea también
Conceptos
Configuración de aplicaciones remotas
Alojar objetos remotos en Servicios de Internet Information Server (IIS)