Uso de los extremos de servicio

Última modificación: martes, 15 de febrero de 2011

Hace referencia a: SharePoint Foundation 2010

En este artículo
Protocolos compatibles
Definición de extremos de servicio
Proporcionar varios extremos
Definición de extremos en el código de aprovisionamiento de servicio
Definición de extremos en la configuración del cliente
Definición de extremos en el código proxy

Todas las comunicaciones con el servicio de Windows Communication Foundation (WCF) se producen a través de extremos de servicio. Un extremo de servicio especifica un contrato que define los métodos de la clase de servicio que son accesibles a través del extremo, y cada extremo puede exponer un conjunto de métodos diferente. Los extremos también definen un enlace que especifica cómo se comunica un cliente con el servicio y la dirección de red donde se encuentra el extremo.

Protocolos compatibles

Service Application Framework admite todos los protocolos compatibles de WCF. Sin embargo, se recomienda usar protocolos http y https para los extremos de servicio:

  • HTTP

  • HTTPS

    Nota

    Service Application Framework instala y configura automáticamente un certificado de Capa de sockets seguros (SSL) para los extremos del servicio HTTPS. La interfaz de usuario de administración de Internet Information Services (IIS) no muestra este certificado, pero sí está instalado. Para confirmar la instalación, escriba el siguiente comando en un símbolo del sistema.

    netsh http show sslcert ipport=0.0.0.0:32844

Definición de extremos de servicio

Cada extremo de servicio compatible con la aplicación de servicio de WCF debe definirse en la configuración de web.config para la aplicación. El protocolo y la dirección de cada extremo deben ser únicos. Por ejemplo, dos extremos pueden tener la misma dirección, si especifican protocolos distintos en sus enlaces respectivos. Sin embargo, si dos extremos usan el mismo protocolo, deben especificar direcciones diferentes.

Use una dirección de extremo única para cada extremo, de modo que estas direcciones no sean dependientes del protocolo de enlace. Especifique una dirección de extremo relativa a la dirección base configurada por Service Application Framework.

Por ejemplo, para especificar dos extremos con direcciones relativas de "http" y "https", use el siguiente código.

<services>
    <service
        name="Microsoft.SharePoint.Test.SampleWebServiceApplication">
        <endpoint
          address="http"
          contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
          binding="customBinding"
          bindingConfiguration="SampleWebServiceHttpBinding" />
        <endpoint
          address="https"
          contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
          binding="customBinding"
          bindingConfiguration="SampleWebServiceHttpsBinding" />
      </service>
    </services>

En el ejemplo anterior, si la dirección base del servicio es http://machine:8080/application/calculator.svc, la dirección del extremo es la siguiente:

http://machine:8080/application/calculator.svc/http

http://machine:8080/application/calculator.svc/https

Proporcionar varios extremos

Una aplicación de servicio puede admitir dos extremos: uno que usa un enlace que está optimizado para el rendimiento (donde, por ejemplo, el tráfico de red entre el servidor front-end web y el servidor de aplicaciones se encuentra en una LAN back-end privada y no tiene que estar cifrado) y uno que usa un enlace que está optimizado para la seguridad (donde el tráfico de red debe estar cifrado). Service Application Framework proporciona una interfaz de usuario que permite a un administrador del conjunto o granja de servidores elegir el extremo más adecuado para la topología de red. Los administradores pueden administrar la selección de extremos mediante la opción Publicar en la página Administración de aplicación de servicio del sitio de Administración central o mediante el parámetro DefaultEndpoint del cmdlet Set-SPServiceApplication de Windows PowerShell.

Definición de extremos en el código de aprovisionamiento de servicio

De manera predeterminada, una aplicación de servicio web tiene un extremo HTTP. Si esta es la configuración que desea usar para la aplicación de servicio, no se requieren cambios. Si desea usar un protocolo diferente, o si desea ofrecer compatibilidad para varios extremos, debe definir explícitamente todos los extremos que serán compatibles con la aplicación de servicio.

Use el método AddServiceEndpoint de SPIisWebServiceApplication tal como se muestra en el ejemplo siguiente.

// Construct your SPIisWebServiceApplication derived class as usual.
MyWebServiceApplication app = new MyWebServiceApplication(…);

// Commit the new application to the configuration database.
// NOTE: Update must be called before AddServiceEndpoint.

// The service application must be committed to the configuration database before endpoints can be added.
app.Update();

// Add the endpoints supported by the application.
// NOTE: AddServiceEndpoint should be called before app.Provision, because app.Provision will provision 
// the default HTTP endpoint if no endpoints are explicitly added to the application.
// NOTE: The default endpoint name is always "http"
app.AddServiceEndpoint("", SPIisWebServiceBindingType.Http);

// Add an alternate HTTPS endpoint.
app.AddServiceEndpoint("secure", SPIisWebServiceBindingType.Https);

El extremo con el nombre "http" se usa como extremo predeterminado de la aplicación de servicio. El nombre de un extremo de servicio debe ser único, incluso si las direcciones de extremo no lo son. Si tiene dos extremos en la misma dirección relativa, deberá usar el tercer parámetro opcional de AddServiceEndpoint para especificar la dirección relativa. El valor predeterminado del tercer parámetro es el nombre del extremo.

En el ejemplo siguiente se muestra cómo definir dos extremos en la misma dirección base del servicio: el primero con el protocolo HTTP y el segundo con el protocolo HTTPS. El extremo de https se encuentra en la dirección base del servicio "".

app.AddServiceEndpoint("", SPIisWebServiceBindingType.Http); 
// The default endpoint.
app.AddServiceEndpoint("https", SPIisWebServiceBindingType.Https, ""); 

Definición de extremos en la configuración del cliente

También se debe definir cada extremo en la configuración del cliente. Cree un archivo client.config con los enlaces que coinciden con el archivo web.config de la aplicación de servicio. Cada extremo de cliente debe tener un valor de atributo name único para que se pueda hacer referencia a él desde el código proxy que va a leer el archivo de configuración, tal como se muestra en el siguiente ejemplo.

Los nombres de configuración de extremo en este ejemplo se eligieron para que coincidieran con las direcciones relativas del extremo de servicio, aunque no es un requisito.

<configuration>
  <system.serviceModel>
    <client>
      <endpoint
        name="http"
        contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
        binding="customBinding"
        bindingConfiguration="SampleWebServiceHttpBinding" />
      <endpoint
        name="https"
        contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
        binding="customBinding"
        bindingConfiguration="SampleWebServiceHttpsBinding" />
    </client>

Definición de extremos en el código proxy

El código proxy debe crear una fábrica de canales mediante la configuración de extremo adecuada. La configuración de extremo se identifica por su nombre (el atributo name del elemento de configuración del cliente endpoint). Para determinar el nombre de la configuración de extremo, revise el URI del extremo antes de crear un canal y comparar la dirección relativa con direcciones de extremo conocidas. El código que se usa para almacenar en caché la fábrica de canales del cliente se muestra en el siguiente ejemplo. Si las direcciones de extremo se diferencian únicamente por el protocolo, use el esquema del URI en la comparación.

private string m_EndpointConfigurationName;
private ChannelFactory<ISampleWebServiceContract> m_ChannelFactory;
private object m_ChannelFactoryLock = new object();

Ahora obtenga el nombre de la configuración de extremo para una dirección de extremo determinada.<param name="address">The endpoint address.</param>

GetEndpointConfigurationName devuelve el nombre de configuración de extremo. El nombre de extremo devuelto debe coincidir con uno de los nombres de elemento de extremo en el archivo client.config.

private string GetEndpointConfigurationName(Uri address)
{
    if (null == address)
    {
        throw new ArgumentNullException("address");
    }
    if (address.Scheme == Uri.UriSchemeHttp)
    {
        return "http";
    }

    if (address.Scheme == Uri.UriSchemeHttps)
    {
        return "https";
    }
    return String.Empty;
}
private ISampleWebServiceContract GetChannel(Uri address)
{
    // Create an endpoint address for the service.
    EndpointAddress endpointAddress = new EndpointAddress(address); 

    // Get the endpoint configuration name.
    string endpointConfigurationName = GetEndpointConfigurationName(address); 
    // Check for a cached channel factory for the endpoint configuration.
    if ((null == m_ChannelFactory) || 
    (endpointConfigurationName != m_EndpointConfigurationName))
    {
        lock (m_ChannelFactoryLock)
        {
            if ((null == m_ChannelFactory) || 
               (endpointConfigurationName != m_EndpointConfigurationName))
            {

                // Create a channel factory
                // endpoint configuration name.
                m_ChannelFactory = 
                CreateChannelFactory<ISampleWebServiceContract>
                (endpointConfigurationName);
                // Store the current endpoint configuration name.
                m_EndpointConfigurationName = endpointConfigurationName;
            }
        }
    }
    // Create a channel from the channel factory.
    return m_ChannelFactory.CreateChannel(endpointAddress);
}

Nota

Si se almacena en caché la fábrica de canales, se debe invalidar la memoria caché.

Vea también

Conceptos

Creación de servicios web del marco de la aplicación de servicio