Creación de conectores personalizados de Servicios de conectividad empresarial mediante SharePoint Server 2010

Resumen: obtenga información sobre cómo crear un conector personalizado de Servicios de conectividad empresarial (BCS) de Microsoft para integrar una gran variedad de orígenes de datos en Microsoft SharePoint Server 2010.

Última modificación: lunes, 22 de agosto de 2011

Hace referencia a: Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

En este artículo
Introducción a la creación de conectores personalizados de Servicios de conectividad empresarial
Codificar el ensamblado
Crear el modelo
Usar el conector personalizado
Conclusión
Recursos adicionales

**Se aplica a:**Microsoft SharePoint Server 2010 | Servicios de conectividad empresarial (BCS) de Microsoft
Proporcionado por: Ricardo Loo Foronda, Microsoft Corporation

Contenido

  • Introducción a la creación de conectores personalizados de Servicios de conectividad empresarial

  • Codificar el ensamblado

  • Crear el modelo

  • Usar el conector personalizado

  • Conclusión

  • Recursos adicionales

Hacer clic para obtener código  Código de descarga: Ejemplo de conector de BCS personalizado

Introducción a la creación de conectores personalizados de Servicios de conectividad empresarial

Microsoft SharePoint Server 2010 ofrece integración con sistemas externos (también conocidos como sistemas de línea de negocio) a través de Servicios de conectividad empresarial (BCS) de Microsoft. Sin embargo, algunos sistemas externos requieren más flexibilidad y mecanismos eficaces para usar correctamente los datos. Los conectores personalizados de Servicios de conectividad empresarial ofrecen esta flexibilidad y eficacia.

En este artículo se tratan los pasos principales para crear un conector personalizado de Servicios de conectividad empresarial, de la siguiente forma:

  • Codificar el ensamblado

  • Crear el modelo

  • Usar el conector personalizado

El ejemplo que se usa en este artículo ayuda a crear un conector personalizado que interactúe con el sistema de archivos. Básicamente, proporciona interacción con una carpeta especificada a través de los siguientes tipos de método:

  • Finder: devuelve una lista de archivos que coinciden con el criterio de carácter comodín especificado.

  • SpecificFinder: devuelve información del archivo para el nombre de archivo especificado.

  • StreamAccesor: devuelve una secuencia de archivos de solo lectura para el nombre de archivo especificado.

Codificar el ensamblado

Un conector personalizado ofrece integración profunda con Servicios de conectividad empresarial, lo que proporciona mecanismos que administran conexiones, usan sistemas de distintos tipos, configuran conexiones y validan metadatos para garantizar que se use un marco común. Se puede crear un conector personalizado para proporcionar esta funcionalidad mediante la implementación de las siguientes interfaces:

  • ISystemUtility (obligatoria). Esta interfaz principal de un conector proporciona mecanismos para ejecutar operaciones en un sistema externo.

  • IConnectionManager (opcional). Esta interfaz permite abrir y cerrar conexiones con el sistema externo.

  • ITypeReflector (opcional). Esta interfaz permite trabajar con las estructuras de datos del sistema externo.

  • ISystemPropertyValidator (opcional). Esta interfaz comprueba las propiedades de los metadatos en un elemento LobSystem (sistema externo) y en elementos LobsystemInstance (sesión de sistema externo).

  • IAdministrableSystem. Esta interfaz se puede implementar para proporcionar la lista de propiedades que se pueden configurar a través de la interfaz de usuario de administración del servicio Conectividad a datos empresariales (BDC).

  • ISystemProxyGenerator. Esta interfaz compila los servidores proxy para conectarse al sistema externo que se pueden conservar para el rendimiento.

La figura 1 muestra información general sobre la clase FileSystemConnector.

Figura 1. Información general sobre FileSystemConnector

Introducción a FileSystemConnector

Adición de referencias e implementación de interfaces

Para empezar a crear un conector personalizado, se deben agregar referencias a los ensamblados siguientes:

  • Microsoft.BusinessData

  • Microsoft.SharePoint

Se pueden encontrar los archivos de ensamblado en la ruta de acceso c:\program files\common files\microsoft shared\web server extensions\14\isapi.

A continuación, se pueden implementar las siguientes interfaces para que el ejemplo funcione:

  • ISystemUtility

  • IAdministrableSystem

  • ISystemPropertyValidator

En las siguientes secciones se describen estas interfaces con más detalle.

Interfaz ISystemUtility

Como interfaz principal, ISystemUtility proporciona funcionalidad para ejecutar operaciones en el sistema externo.

En el ejemplo, el método ExecuteStatic proporciona la funcionalidad para el método Finder, el método SpecificFinder y el método StreamAccesor. El siguiente código muestra la firma para el método ExecuteStatic.

public void ExecuteStatic(IMethodInstance methodInstance, ILobSystemInstance lobSystemInstance, object[] 
methodSignatureArgs, IExecutionContext context)

Se deben validar los parámetros in y la carpeta de base, donde se producirán operaciones Crear, Leer, Actualizar y Eliminar. Esto se muestra en el siguiente código.

if (methodInstance == null)
{
    throw (new ArgumentNullException("methodInstance"));
}
if (lobSystemInstance == null)
{
    throw (new ArgumentNullException("lobSystemInstance"));
}
if (methodSignatureArgs == null)
{
    throw (new ArgumentNullException("args"));
}

object baseFolderValue;
if (!lobSystemInstance.GetProperties().TryGetValue(baseFolderPropertyName, out baseFolderValue))
{
    throw new InvalidOperationException("BaseFolder property is missing");
}

String baseFolderName = baseFolderValue as string;

if (String.IsNullOrEmpty(baseFolderName))
{
    throw new InvalidOperationException("BaseFolder property contains an invalid value.");
}

DirectoryInfo baseFolder = new DirectoryInfo(baseFolderName);

if (!baseFolder.Exists)
{
    throw new InvalidOperationException("Base folder doesn't exist.");
}

Ahora, observe lo siguiente:

  • El primer parámetro, IMethodInstance methodInstance, incluye la propiedad MethodInstanceType. Esto indica el tipo de método al que se está llamando.

  • El tercer parámetro, object[] methodSignatureArgs, puede contener muchos subparámetros que resultan útiles para la propiedad MethodInstanceType.

Con esta información, se puede crear un controlador para cada MethodInstanceType.

El tipo Finder tiene los siguientes subparámetros:

  • methodSignatureArgs[0]: una cadena de búsqueda con caracteres comodín para un nombre de archivo.

  • methodSignatureArgs[1]: el objeto de devolución (una lista de objetos FileInfo).

Los subparámetros del tipo Finder se muestran en el siguiente código.

if (methodInstance.MethodInstanceType == MethodInstanceType.Finder)
{
    String wildcard = methodSignatureArgs[0] as string;
    IList<FileInfo> results = new List<FileInfo>();
    methodSignatureArgs[1] = baseFolder.GetFiles(wildcard);
}

El tipo SpecificFinder tiene los siguientes subparámetros:

  • methodSignatureArgs[0]: el nombre de archivo.

  • methodSignatureArgs[1]: el objeto de devolución (un objeto FileInfo).

Los subparámetros del tipo SpecificFinder se muestran en el siguiente código.

if (methodInstance.MethodInstanceType == MethodInstanceType.SpecificFinder)
{
    string fileName = methodSignatureArgs[0] as string;
    FileInfo result = new FileInfo(Path.Combine(baseFolder.FullName, fileName));
    if (result.Exists && result.Directory.FullName.Equals(baseFolder.FullName))
    {
        methodSignatureArgs[1] = result;
    }
}

El tipo StreamAccesor tiene los siguientes subparámetros:

  • methodSignatureArgs[0]: el nombre de archivo.

  • methodSignatureArgs[1]: el objeto de devolución (un objeto FileStream).

Los subparámetros del tipo StreamAccesor se muestran en el siguiente código.

if (methodInstance.MethodInstanceType == MethodInstanceType.StreamAccessor)
{
    string fileName = methodSignatureArgs[0] as string;
    FileInfo result = new FileInfo(Path.Combine(baseFolder.FullName, fileName));
    if (result.Exists && result.Directory.FullName.Equals(baseFolder.FullName))
    {
        methodSignatureArgs[1] = result.OpenRead();
    }
}

Interfaz IAdministrableSystem

Tal como se describe anteriormente en este artículo, la interfaz IAdministrableSystem proporciona la lista de propiedades que se administran a través de la interfaz de usuario de administración de Servicios de conectividad empresarial. En este caso, se cuenta con una sola propiedad, BaseFolder, que especifica el directorio de trabajo.

Se puede almacenar el valor en una variable de clase denominada baseFolderPropertyName a través de la propiedad AdministrableLobSystemInstanceProperties, tal como se muestra en el código siguiente.

public IList<AdministrableProperty> AdministrableLobSystemInstanceProperties
{
    get
    {
        return new List<AdministrableProperty>()
        {
            new AdministrableProperty("Base Folder","The path to the folder that stores the data.", 
              typeof(string), baseFolderPropertyName, typeof(string), true)  
        };
    }
}

Interfaz ISystemPropertyValidator

Use la interfaz ISystemPropertyValidator para comprobar la validez de las propiedades. En este caso, sólo tiene la propiedad BaseFolder. Compruebe si existe la carpeta y, si no existe, inicie una excepción. Esto se muestra en el siguiente código.

public void ValidateLobSystemInstanceProperty(string name, ref object value, string metadataObjectName, 
   Type metadataObjectType)
{
    // Validate whether the given directory exists.
    if (name == baseFolderPropertyName)
    {
        String folderName = value as string;
        if (!Directory.Exists(folderName))
        {
            throw new ArgumentException("The given directory does not exist.");
        }
    }
}

Crear el modelo

Se puede crear el modelo de tres maneras: mediante Microsoft SharePoint Designer 2010, mediante Microsoft Visual Studio 2010 o mediante la creación de un archivo de modelo que se pueda importar a través de Administración central de SharePoint.

Por motivos de simplicidad, en este artículo se explora la tercera opción: la creación de un archivo de modelo. Para empezar, es necesario tener un conocimiento general de FileSystemLOB, tal como se muestra en la figura 2.

Figura 2. Información general sobre FileSystemLOB

Introducción a FileSystemLOB

En las secciones siguientes se describen estas propiedades, métodos e identificador.

Propiedades FileSystemLOB

El elemento LobSystem tiene la propiedad SystemUtilityTypeName, que se define mediante el siguiente fragmento XML. Tenga en cuenta que esto coincide con la lista AdministrableLobSystemProperties en la interfaz IAdministrableSystem.

<Properties>
  <Property Name="SystemUtilityTypeName" Type="System.String">
    BusinessDataConnectivitySamples.Connectors.FileSystemConnector,
    BusinessDataConnectivitySamples.Connectors,
    Version=14.0.0.0,
    Culture=Neutral,
    PublicKeyToken=2154d1c691e2e909
  </Property>
</Properties>

Coloque el nombre completo del ensamblado en la propiedad SystemUtilityTypeName.

Instancia TestFileSystemCustomShimInstance

La instancia TestFileSystemCustomShimInstance se define mediante el siguiente fragmento XML. Observe que la propiedad BaseFolder coincida con la de la interfaz IAdministrableSystem.

<LobSystemInstance Name="TestFileSystemCustomShim">
  <Properties>
    <Property Name="BaseFolder" Type="System.String">c:\testfolder</Property>
  </Properties>
</LobSystemInstance>

Tipo de contenido externo del archivo

El elemento XML Entity es la sección más grande del modelo y define las propiedades, métodos e identificador de los archivos. Esto se muestra en el siguiente fragmento XML.

<Entity EstimatedInstanceCount="1000" Name="File" Namespace="BDCSamples.Connectors.FileSystem" Version="1.0.0.0">
<Identifiers>
  <Identifier TypeName="System.String" Name="FileName"/>
</Identifiers>
<Methods>
<Method Name="ReadFile">
<Method Name="ReadFiles">
<Method Name="GetFileContents">
</Methods>
</Entity>

Servicios de conectividad empresarial también necesita una forma de identificar de forma exclusiva cada elemento (en este caso, el archivo). Esto se hace mediante el identificador, que en este ejemplo es la propiedad FileName.

A continuación se muestran los métodos, que por lo general se ajustan a la siguiente estructura:

  • Parámetros de entrada

  • Parámetros de devolución

  • Instancias de método

  • Listas de control de acceso (ACL)

Los métodos se asignan a las operaciones descritas en el método ExecuteInternal de la interfaz ISystemUtility. En el siguiente marcado, sólo se muestra el fragmento XML del método ReadFile. Pero se pueden comprobar las operaciones restantes en los archivos que se incluyen en este artículo (vea el ejemplo de conector de BCS personalizado).

<Method Name="ReadFile">
  <Parameters>
  <Parameter Direction="In" Name="FileName">
    <TypeDescriptor TypeName="System.String" IdentifierName="FileName" Name="FileName" />
  </Parameter>
  <Parameter Direction="Return" Name="FileDetails">
    <TypeDescriptor TypeName="System.IO.FileInfo, mscorlib, Version=2.0.0.0, Culture=neutral, 
       PublicKeyToken=b77a5c561934e089" Name="FileDetails">
    <TypeDescriptors>
      <TypeDescriptor Name="Name" TypeName="System.String" IdentifierName="FileName" ReadOnly="true" />
      <TypeDescriptor Name="Attributes" TypeName="System.IO.FileAttributes, mscorlib, Version=2.0.0.0, 
        Culture=neutral, PublicKeyToken=b77a5c561934e089" ReadOnly="true"/>
      <TypeDescriptor Name="LastWriteTimeUtc" TypeName="System.DateTime" ReadOnly="true">
      <Interpretation>
        <NormalizeDateTime LobDateTimeMode="UTC"/>
      </Interpretation>
      </TypeDescriptor>
    </TypeDescriptors>
    </TypeDescriptor>
  </Parameter>
  </Parameters>
  <MethodInstances>
  <MethodInstance Type="SpecificFinder" ReturnParameterName="FileDetails" Name="FileSystemFinder">
    <!--<AccessControlList>
    <AccessControlEntry Principal="Domain\username">
      <Right BdcRight="Execute"/>
    </AccessControlEntry>
    </AccessControlList>-->
  </MethodInstance>
  </MethodInstances>
</Method>

Usar el conector personalizado

El siguiente paso es ver el conector personalizado en funcionamiento. Antes de hacer esto, se llevará a cabo la siguiente serie de pasos:

  1. Instale el ensamblado en la memoria caché global de ensamblados.

  2. Importe el modelo.

  3. Cree la lista externa.

  4. Agregue y quite los archivos en la carpeta especificada.

Instalación del ensamblado en la memoria caché global de ensamblados

Se puede instalar el ensamblado en la memoria caché global de ensamblados de varias formas, pero para el ejemplo de este artículo, simplemente arrastre el archivo de ensamblado a la carpeta c:\windows\assembly.

Importación del modelo

A continuación, siga estos pasos para importar el modelo desde las páginas de Administración central.

Para importar el modelo desde las páginas de Administración central

  1. Abra Administración central de SharePoint 2010.

  2. En Administración de aplicaciones, seleccione Administrar aplicaciones de servicio.

  3. Haga clic en la aplicación de servicio Conectividad a datos empresariales.

  4. Haga clic en la pestaña Editar y, a continuación, haga clic en Importar en la Cinta de Server.

  5. En el archivo de modelo BDC, seleccione el archivo de modelo (en este ejemplo, FileSystemConnector.bdcm).

  6. En Tipo de archivo, compruebe que la opción modelo esté seleccionada.

  7. En Configuración avanzada, compruebe que Nombres localizados, Propiedades y Permisos estén seleccionados.

  8. Haga clic en Importar.

Ahora, el modelo está importado, tal como se muestra en la figura 3.

Figura 3. Modelo importado

Modelo importado

Haga clic en el modelo para descubrir los tipos de contenido externo, tal como se muestra en la figura 4.

Figura 4. Tipos de contenido externo

Tipos de contenido externo

Creación de la lista externa

Hay muchas formas de crear la lista externa. Sin embargo, en este artículo se describe sólo una forma, tal como se muestra en los pasos siguientes.

Para crear la lista externa

  1. Navegue al sitio donde desee crear la lista externa.

  2. En el menú Acciones del sitio, haga clic en Ver todo el contenido del sitio.

  3. Haga clic en Crear.

  4. Seleccione el tipo Lista externa y, a continuación, haga clic en Crear.

  5. Asigne un nombre a la lista y, a continuación, haga clic en Seleccionar tipo de contenido externo.

  6. Haga clic en Crear.

La lista externa está lista para recibir información (o archivos), tal como se muestra en la figura 5.

Figura 5. Lista externa creada

Lista externa creada

Agregar o quitar archivos

Agregue o quite archivos en la carpeta c:\testfolder y la lista se sincronizará según corresponda. La figura 6 muestra la sincronización de la carpeta y la lista.

Figura 6. Sincronización de la carpeta y la lista

Sincronización de listas y directorios

Conclusión

Mediante Servicios de conectividad empresarial (BCS) de Microsoft, se puede conectar con distintos tipos de sistemas externos. Cada tipo de sistema externo requiere un conector específico. De manera predeterminada, Servicios de conectividad empresarial incluye conectores para tener acceso a datos profesionales que se exponen a través de bases de datos y servicios web. Sin embargo, algunos datos profesionales se puede exponer mediante otros mecanismos o pueden necesitar más procesamiento antes de que Servicios de conectividad empresarial pueda usar los datos. Para resolver estos problemas sencillos de un sistema externo, Servicios de conectividad empresarial también proporciona el conector de ensamblado de Microsoft .NET Framework, donde la lógica para conectarse con el sistema externo y cualquier procesamiento se compila en un ensamblado sencillo que expone las funciones que Servicios de conectividad empresarial puede entender. Aunque este conjunto de conectores trata la mayoría de los sistemas externos, no siempre son suficientes. Es posible que necesite más control sobre las conexiones y modelos, o que tenga que conectarse a varios sistemas externos diferentes del mismo tipo. El conector del ensamblado de .NET Framework no resuelve estos problemas. Sin embargo, como se describe en este artículo, puede crear su propio conector personalizado para resolverlos.

Recursos adicionales

Para obtener más información, vea los siguientes recursos: