Compartir a través de


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 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 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 la codificación SSL (Secure Sockets Layer) para ese directorio virtual (en el ejemplo no se refleja este proceso).

PRECAUCIÓN   .NET remoting no autentica ni codifica 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 remoting requieren permisos FullTrust para ejecutarse, si a un cliente no autorizado se le ha concedido acceso en su servidor, el cliente podrá ejecutar código como si fuera de total confianza. Autentique siempre los extremos y codifique 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

  1. Guarde todos los archivos en un directorio denominado RemoteIIS.

  2. 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

  3. Cree un subdirectorio \bin y copie ServiceClass.dll en ese directorio.

  4. Cree un directorio virtual en IIS. Cree el alias del directorio virtual "HttpBinary" y establezca el directorio de origen en el directorio "RemoteIIS".

  5. Establezca el método de autenticación de este directorio virtual en Autenticación integrada de Windows (anteriormente autenticación NTLM).

  6. Asegúrese de que se inicie IIS; 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

Ejemplos de interacción remota | Configuración | Alojar objetos remotos en Servicios de Internet Information Server (IIS)