Este artículo proviene de un motor de traducción automática.

Pronóstico: nuboso

Enviar contenido de SharePoint al almacenamiento de Windows Azure

Joseph Fultz

Descargar el ejemplo de código

Tengo un coautor de este mes, como compañero Shad Phillips me ayudó a con un proyecto reciente que trabajaba con un cliente en una prueba de concepto que utiliza SharePoint 2010 como plataforma de aplicaciones. En el lado uno de personal de los clientes me pidió si podría pensar de manera razonable para tomar el contenido aprobado desde SharePoint y publicarlo, ponerlo a disposición de las personas de fuera de la red corporativa.

La infraestructura del cliente actual no admite contenido externo (que se pueden descargables documentos y vídeos). Necesidad de realizar una gran cantidad de trabajo con Windows Azure, inmediatamente pensé que sería muy sencillo incorporar e inserta el contenido para el almacenamiento de Windows Azure como parte del flujo de trabajo y, a continuación, en función de necesita, haciéndolo público o proporcionar acceso basado en concesiones para restringe el contenido.

Con eso en mente, hablado con Mi colega, shad, que anteriormente había resuelto un problema similar en la que había implementado un método de ejemplo para archivar los documentos de SharePoint de la biblioteca para el almacenamiento de Windows Azure. La intención de esa solución es diferente de mi objetivo, los mecanismos son los mismos. Este mes, shad y me guiará a través de una implementación de ejemplo que se introduce el contenido de SharePoint para Azure almacenamiento de Windows y la tapa un poco acerca del control de acceso de la concesión para los archivos.

Escenario y el programa de instalación

En concreto, desarrollamos una función personalizada que permite a un usuario de forma selectiva insertar un documento de SharePoint a Azure de almacenamiento de Windows. Por alguna razón inexplicable, los usuarios no suelen gustan cuando se mueven sus documentos y no se proporcionan vínculos para encontrar, por lo que deja un vínculo en la biblioteca de documentos a la ubicación de la nube que se comporta igual que lo haría si el documento en una ubicación que no sean de nube.

Software necesario:

  • 2010 De Visual Studio
  • Microsoft SharePoint 2010
  • Windows SDK Azure
  • Servicio de almacenamiento Azure de desarrollo de Windows

Sitio de SharePoint 2010 y configuración de la biblioteca de documentos

En este escenario, hemos creado un sitio de SharePoint utilizando la plantilla de sitio de grupo. En la biblioteca de documentos compartidos, se crea una columna que permite marcar un elemento como almacenadas a Windows Azure. Esto se realiza a través de la configuración de la biblioteca puede tener acceso a través de la cinta de opciones. Una vez en la configuración de la biblioteca, se crea una columna con las propiedades que se muestra en de figura 1.

image: Column Settings on the Team Site Template

Figura 1 de la configuración de columna en la plantilla de sitio de grupo

En Configuración avanzada, también seleccionamos “ Sí ” para la configuración de “ permitir la administración de los tipos de contenido ”.

Utilizamos esto como parte de un tipo de contenido de la que se denomina vínculo a un documento. A continuación, creamos instancias de este tipo de contenido como un medio para vincular el documento archivado, como se muestra en de figura 2.

image: Our New “Link to a Document” Content Type

La figura 2 de nuestro nuevo tipo de contenido “ vincular a un documento ”

Una vez que la columna y el tipo de contenido se han agregado a la biblioteca de documentos, se carga un documento de Word de ejemplo denominado SOW.docx de servicios.

Web.config 2010 de SharePoint

Para conectarse a la nube, necesitamos obtener los valores que son necesarias para conectar con Windows Azure. En este caso, se utiliza el almacenamiento de información de desarrollo y agregarán las claves para el <appSettings>elemento en el archivo web.config, tal como se muestra en de figura 3.

image: Adding Keys in Web.config

La figura 3 de Agregar las claves en el archivo Web.config

Proyecto de SharePoint

Afortunadamente, para utilizar Visual Studio de 2010 2010 de SharePoint, es una experiencia de desarrollador interesante a crear, depurar y publicar las nuevas características. Creamos una función de SharePoint (consulte msdn.microsoft.com/library/bb861828(office.12) para obtener más información sobre esto), que agrega una acción personalizada a ’ los elementos de acción desplegable menús en la biblioteca de documentos. El usuario ha hecho clic para utilizar la característica de almacenamiento.

Comenzamos creando una solución denominada MSSAzureArchive mediante la plantilla proyecto vacío de SharePoint (consulte de figura 4).

image: Project Selection in Visual Studio 2010

La figura 4 de la selección de proyectos en Visual Studio de 2010

A continuación, se especifica el nivel de sitio y de seguridad para la depuración. Hemos decidido elija “ implementar como una solución de conjunto de servidores ” debido a que el código deba realizar llamadas externas, lo que no permite la solución de recinto de seguridad. Las referencias necesarias para agregarse al proyecto para Microsoft.Windows.Azure.StorageClient y System.Web. A continuación, se agrega un elemento de elemento vacío al proyecto mediante la plantilla de EmptyElement y lo ha llamado AzureStorageElement. Se ha agregado un <CustomAction/>elemento para agregar un nuevo elemento de acción en el menú contextual para los elementos de la biblioteca de documentos (vea de figura 5).

image: Adding an AzureStorageElement via Add New Item

La figura 5 de Agregar un AzureStorageElement a través de agregar nuevo elemento

Una función nueva denominada Feature1 se agregó automáticamente al proyecto, que se ha cambiado el nombre a MSSAzureArchive. Se reemplaza el contenido del archivo Elements.xml para AzureStorageElement en el que se ha agregado con la siguiente:

<?xml version="1.0" encoding="utf-8"?>
 <Elements xmlns="https://schemas.microsoft.com/sharepoint/">
   <CustomAction
     Id="UserInterfaceCustomActions.ECBItemToolbar"
     RegistrationType="List"
     RegistrationId="101"
     Location="EditControlBlock"
     Sequence="106"
     Title="Azure Storage">
     <UrlAction Url="~sitecollection/
       _layouts/MSSAzureArchive/
       AzureStorage.aspx?ItemUrl={ItemUrl}" />
   </CustomAction>
 </Elements>

Para los desarrolladores de SharePoint uninitiated, de figura 6 muestra una descripción rápida de algunas de las <CustomAction/>Propiedades (obtener más información acerca de la <CustomAction/>elemento y sus propiedades pueden encontrarse en msdn.microsoft.com/library/ms460194 de ).

La figura 6 Propiedades de la <CustomAction/>Elemento

Propiedad Función
Id. Identificador único.
Ubicación Especifica dónde debe aparecer el elemento en la interfaz de usuario de SharePoint. En este caso, el elemento de menú (EditControlBlock) es la ubicación deseada y, por ejemplo, la cinta de opciones.
Secuencia Especifica la prioridad de ordenación para las acciones.

Tenga en cuenta la propiedad Url del elemento UrlAction;se trata de la acción de exploración que se produce a fin de controlar el comando para archivar el documento. Según esta configuración, SharePoint conoce su ubicación de la función de la interfaz de usuario y también qué hacer cuando un usuario hace clic en él. SharePoint se desplazará a una página que se cree que va a controlar el archivado del documento seleccionado. Esta página permite al usuario seleccionar un contenedor de almacenamiento de destino o cree un nuevo contenedor de almacenamiento para el elemento, por lo que necesitamos agregar un elemento de la página de la aplicación para el proyecto. Una vez más con las plantillas de SharePoint 2010, hemos elegido de la plantilla de página de la aplicación y lo ha llamado AzureStorage.aspx (consulte la figura 7).

image: Adding a New Page in SharePoint 2010

La figura 7 de Agregar una nueva página en SharePoint 2010

Dado que este ejemplo no se ha impresionar a cualquiera que tenga un diseño de la interfaz de usuario de "genius", hemos agregado sólo los controles mínimos necesarios para llevar a cabo el trabajo. En el < asp: Content >elemento de marcado del página, agregamos el código que se muestra en de figura 8.

La figura 8 de Agregar los controles necesarios de mínima

Document to Archive:
<asp:Label ID="fileName" runat="server" ></asp:Label>   <br/>   
Choose Azure Container:
<asp:DropDownList ID="azureContainers" runat="server"  
  Visible="true"></asp:DropDownList>   
<asp:TextBox id="newContainerName" runat="server" Visible="false"></asp:TextBox>
<asp:Button ID="saveContainer" runat="server" Text="Save Container" 
  OnClick="SaveContainer_Click" Visible="false"></asp:Button>
<br />
<asp:Button ID="createContainer" runat="server" Text="Create New Container" 
  OnClick="CreateContainer_Click" />
<br/>
<asp:Button ID="archiveFile" runat="server" Text="Archive File" 
  OnClick="Archive_Click" />       
<br/>
<asp:Label ID="errMessage" runat="server" Text=""></asp:Label>

A continuación, se modifica el código con cables de los elementos de interfaz de usuario a código para ponerse en contacto con el almacenamiento de información de Windows Azure y procesa la información. Se inicializa al cliente de almacenamiento de nube en el evento de carga de la página y obtienen los contenedores disponibles con la configuración de web.config anterior (consulte de figura 9).

La figura 9 de inicializar al cliente de almacenamiento de nube

protected void Page_Load(object sender, EventArgs e)
{

  this.InitializeCloudStorage();
  if (!IsPostBack)
  {
    this.GetContainers();
  }
}

private void GetContainers()
{
  IEnumerable<CloudBlobContainer> blobContainers =  
    cloudBlobClient.ListContainers();

  this.azureContainers.DataSource = blobContainers;
  azureContainers.DataTextField = "Name";
  this.azureContainers.DataBind();
  if (azureContainers.Items.Count < 1)
  {
    ListItem defaultContainer = new ListItem(defaultContainerName);
    defaultContainer.Selected = true;
    azureContainers.Items.Add(defaultContainer);
  }
}

Debido a que el enfoque que aquí se encuentra en la funcionalidad de almacenamiento, nos concentramos en la. El otro código está disponible a través de la descarga (code.msdn.microsoft.com/mag201012Cloudy ). Se agrega un controlador de clic del botón archiveFile y con cables de la función Archive_Click a él. Se basa en el elemento de UrlAction, podemos recuperar la ruta de acceso al elemento. En la función hacer clic, se recupera el elemento de SharePoint mediante el modelo de objetos, que se comprueba para ver si ya se ha archivado y, en caso contrario, cargados en el contenedor seleccionado (vea de figura 10).

La figura 10 del código para la función hacer clic recuperar el elemento de SharePoint

protected void Archive_Click(object o, EventArgs e)
{
  try
  {
    webSite = SPContext.Current.Web;
    filePath = webSite.Url.ToString() + 
    Request.QueryString["ItemUrl"].ToString();
    fileToArchive = webSite.GetFile(filePath);
    string sArchived = fileToArchive.Item["IsArchived"].ToString(); 

    bool isArchived = Convert.ToBoolean(sArchived);

    if (isArchived)
    {
      errMessage.Text = "This document has already been archived!";
    }
    else
    {
      string newGuid = Guid.NewGuid().ToString();
      string uniqueBlobName = string.Format(newGuid + "_" + 
        fileToArchive.Name.ToString());

      blobContainer = cloudBlobClient.GetContainerReference(
        this.azureContainers.SelectedValue);
      blobContainer.CreateIfNotExist();
      cloudBlob = blobContainer.GetBlockBlobReference(uniqueBlobName);
      cloudBlob.UploadByteArray(fileToArchive.OpenBinary());

Después de carga el elemento de almacenamiento, se elimina un elemento de archivo nuevo del tipo “ vincular a documento ” se crea en lugar del documento original y el documento original. Si fuera un caso de la publicación en su lugar de funciones de archivo, el elemento original que es probable que no se eliminará, pero simplemente marcado como publicada con un vínculo a la versión publicada. Para obtener la biblioteca de documentos de destino y la ruta de acceso del documento original, se utiliza el elemento original. El nuevo elemento se marca como archivado mediante la adición de la propiedad IsArchived y asignar el valor “ true ”. En primer lugar hemos hecho algún trabajo para obtener algunos de los valores que sea necesario y, a continuación, se crea el nuevo elemento y le asignan los valores, como se muestra aquí:

SPDocumentLibrary docLib = 
  fileToArchive.DocumentLibrary;

Hashtable docProperties = new Hashtable();
docProperties["IsArchived"] = true;
string docLibRelPath = 
  docLib.RootFolder.ServerRelativeUrl;
string docLibPath = string.Empty;
webSiteCollection = SPContext.Current.Site;
docLibPath = 
  webSiteCollection.MakeFullUrl(docLibRelPath);

string azureURL = cloudBlob.Uri.ToString();

La función BuildLinkToItem crea una instancia del tipo de contenido “ vincular a un documento ” utilizando la ruta de acceso al elemento de almacenamiento de Windows Azure. Esta instancia del tipo de contenido se agregará a la biblioteca que el vínculo para recuperar el elemento de almacenamiento de Azure de Windows a través de la interfaz de usuario de SharePoint, como se muestra aquí:

string azureStub = this.BuildLinkToItem(azureURL).ToString();

  SPFile newFile = webSite.Files.Add(documentPath,     
    UTF8Encoding.UTF8.GetBytes(azureStub), docProperties, true);

  SPListItem item = newFile.Item;
  item["Content Type"] = "Link to a Document";
  SPFieldUrlValue itemUrl = new SPFieldUrlValue();
  itemUrl.Description = fileToArchive.Name;
  itemUrl.Url = azureURL;
  item["URL"] = itemUrl;
  item["IsArchived"] = true;
  item.Update();
  fileToArchive.Delete();

Con el código finalizado para guardar el documento, muévalo y reemplazarlo por un vínculo para el almacenamiento de Windows Azure, llegó el momento de centrarse en la generación y la implementación de la solución. Hemos hecho doble clic en el archivo Package.package para abrir el Diseñador de paquetes y, posteriormente, se selecciona la ficha Opciones avanzadas en la parte inferior de la pantalla. Esto es donde se ha agregado los ensamblados de paquete que necesitábamos a fin de incluir la Microsoft.WindowsAzure.StorageClient.dll. Complicar este ejemplo, se establece el destino de implementación para el GlobalAssemblyCache. Se garantiza que se está ejecutando almacenamiento de información de desarrollo por explorar en el Explorador de servidores, al hacer clic en el nodo de almacenamiento de Azure de Windows, a continuación, haga clic en el nodo “ (Development) ”.

Iniciar precaución al viento, se presiona F5 para generar, implementar, asociar a un proceso y inicia una sesión del explorador para iniciar la depuración de la función. Hemos desplazado a la biblioteca de documentos compartidos que se ha mencionado anteriormente y se abre el menú desplegable que se adjunta al documento que se haya cargado anteriormente. En la lista desplegable, seleccionamos el nuevo elemento, Azure almacenamiento, lo que nos llevó a la página de aplicación personalizada para seleccionar el contenedor de destino (vea de figura 11).

image: Selecting the Windows Azure Storage Element

La figura 11 de Seleccionar el elemento de almacenamiento Azure de Windows

Una vez en la página, se ha podido ha creado un nuevo contenedor, pero en su lugar se utiliza el contenedor de documentos que se crean y se hace clic en el botón de archivo de almacenamiento para ejecutar el código de versiones anteriores (vea de figura 12).

image: Selecting the Container

La figura 12 de Seleccionar el contenedor

Con el archivo que se archivan en almacenamiento Azure de Windows, desplazarse a la biblioteca de documentos compartidos. En lugar de ver el documento, se ha visto un vínculo a un elemento de documento que reemplaza el documento de Word SOW.docx de servicios (consulte de figura 13).

image: Link to Document in the SharePoint Documents Library

La figura 13 del vínculo a documento en la biblioteca de documentos de SharePoint

Cuando se ha examinado las propiedades del elemento, ya hemos visto en los campos relacionados con el tipo de contenido y en particular, la dirección URL a donde ahora reside el documento en el almacenamiento de Windows Azure (consulte de figura 14).

image: Link Properties

La figura 14 de Propiedades de vínculo

Se ha podido abrir el documento directamente desde el almacenamiento de Azure de Windows, haga clic en Vincular a un documento. Podríamos usar la propiedad URL para tener acceso a él directamente o a través de otra interfaz de usuario o código. Por ejemplo, si desean seguir indizar estos elementos mediante el servicio de indización de SharePoint, podríamos crear un IFilter personalizado que se sabe cómo procesar el vínculo a un tipo de contenido de documento para asegurarse de que el contenido podría obtener indizado correctamente.

Con la implementación de archivado de contenido de una biblioteca de documentos de SharePoint para borrar un contenedor de almacenamiento de Azure de Windows, nos deja con sólo público o no tiene acceso a los documentos archivados para no autenticado a las solicitudes.

Control de acceso cuando la publicación

Como se mencionó anteriormente, qué llevarme hablar con shad su fragmento de archivo se ha producido el uso de almacenamiento de Windows Azure como medio para proporcionar un público de manchas de color para el contenido que se había desplazado a través de la revisión y aprobación de inicio. En el caso de que estoy teniendo en cuenta, no hay que incluir cualquier control de acceso, porque los documentos que se comparta con todos los usuarios. Sin embargo, sólo tardó unos minutos para que otra persona formular la pregunta: “ ¿Qué ocurre si desea publicar algo y que esté disponible sólo para determinadas personas, por ejemplo, proveedores, clientes o empleados? ” A menudo una tarea como ésta se lleva a cabo dentro de las empresas, incluidas las personas como parte de un dominio corporativo o si dichos federados de alguna manera, de modo que se identifican por medio de desafío del nombre de usuario y contraseña. Esto no era el caso de aquí, y realmente no desea que el cliente establecer algún nivel de aplicación o front-end para controlar el acceso;desarrollar la aplicación de cliente, se reduciría el valor si aumenta los costos de implementación.

Una solución es utilizar un SharedAccessPolicy en los objetos binarios. El contenedor y objetos binarios en el contenedor tiene su conjunto PublicAccess a otra con un poco de código se escribiría probablemente realizando el desarrollo de almacenamiento de Windows Azure todos modos. El siguiente ejemplo de código muestra cómo puedo establecer el PublicAccess a OFF, pero permitir para SharedAccess en el contenedor debería I generar una firma y se entrega:

BlobContainerPermissions permissions = new BlobContainerPermissions();
  permissions.PublicAccess = BlobContainerPublicAccessType.Off;

  SharedAccessPolicy accesspolicy = new SharedAccessPolicy();
  accesspolicy.Permissions = SharedAccessPermissions.Read;
  permissions.SharedAccessPolicies.Add("Read", accesspolicy);

  BlobContainer.SetPermissions(permissions);

Si se solicita un recurso directamente en el contenedor de almacenamiento, obtendremos un 404 no se encontró la página. Tal como se carga en los objetos binarios, hacemos algo similar de trabajo para el objeto binario de sí mismo, pero creamos un SharedAccessPolicy que permite leer, establecer una fecha de caducidad para el mismo y pedir, una firma de Access compartida similar al siguiente:

SharedAccessPolicy policy = new SharedAccessPolicy();
policy.Permissions = SharedAccessPermissions.Read;
policy.SharedAccessExpiryTime = DateTime.Now.AddDays(5);
string SharedAccessSignature = destBlob.GetSharedAccessSignature(policy));

La llamada a GetSharedAccessSignature devuelve una cadena similar al siguiente:

?se=2010-08-26T18%3A22%3A07Z&sr=b&sp=r&sig=WdUHKvQYnbOcMwUdFavn4QS0lvhAnqBAnVnC6x0zPj8%3D

Si concatenar esa cadena de consulta al final de la dirección URI para el objeto binario, debería recibo, lo que proporciona que la caducidad no ha pasado. Puede encontrar más información acerca de la firma y directivas de acceso compartido en msdn.microsoft.com/library/ee395415 de .

Para resolver el problema, podría generar firmas y proporcionar la firma de los identificadores URI que tenían una caducidad largo, lo que facilita la tarea se crean en el momento de cargar y, a continuación, almacenar una lista de vínculos a los documentos publicados. Para algo un poco más segura y que desea utilizar proporcionar acceso a un usuario individual durante un breve período de tiempo, necesitaría una parte de la interfaz de usuario. Interfaz de usuario permitiría que un usuario solicitar acceso a uno o varios recursos y obtener nuevo había firmado a los identificadores URI que proporcionarían acceso durante un período corto de tiempo.

Mezcla de la nube

Aquí shad y se utiliza una implementación general para abordar dos escenarios diferentes. Esto era especialmente útil en ambos casos, necesitamos una parte específica de funcionalidad (almacenamiento escalable, confiable y ampliable) de la nube sin nosotros tener que realizar gran parte en el medio de instalación y sólo lo que se utiliza la gestión de costes. La idea principal que esperamos para transmitir es que, como los profesionales que desean para crear soluciones para nuestros clientes (interna o externa), nuestros conceptos de solución no es necesario estar en la nube o en instalaciones exclusivamente. Los dos pueden combinarse con facilidad. Como el servicio de actualizaciones se aplican a lo largo del tiempo, pasará a ser más fácil y más fáciles de la red corporativa a la red de la nube de mezcla. En el futuro que espero que fundirá hasta el punto de allí no es la mayor parte de una diferencia. Por lo tanto, ya que está buscando en las soluciones de los sistemas de software o negocio, es posible que unos instantes en pausa y de reflexión, “ ¿tiene algún valor en la nube que me ayudará ”?

Joseph Fultz es arquitecto en el centro de tecnología de Microsoft en Dallas, donde trabaja con los clientes de empresa y los ISV que diseñar y soluciones de software de creación de prototipos para satisfacer las necesidades de negocio y de mercado. Se habla en eventos, como Tech Ed y eventos de formación interna similar.

Phillips shad es un arquitecto en el centro de tecnología de Microsoft en Dallas, donde trabaja con asociados y clientes empresariales diseñar e implementar soluciones de administración de contenido de empresa integradas de Microsoft SharePoint 2010.

Gracias al siguiente experto técnico para este artículo: Jasen Tenney