miércoles, 22 de diciembre de 2010

Como descargar un archivo de una forma de un flujo (infopath)

Buenas, a continuación les dejo el código, para descargar un archivo, de una tarea de un flujo de sharepoin (Infopath), esto es para no tener que almacenarlo en alguna lista, o generarlo físicamente.

System.Collections.Hashtable extendedProp = Microsoft.SharePoint.Workflow.SPWorkflowTask.GetExtendedPropertiesAsHashtable(item);
//Response.ContentType = "text/HTML";
//Response.BinaryWrite(Convert.FromBase64String(extendedProp["FileAttached"] as String));

if (!String.IsNullOrEmpty((extendedProp["FileAttached"] as String)))
{
byte[] data = Convert.FromBase64String(extendedProp["FileAttached"] as String);
byte[] buffer = data;
Int32 blockSize = 10;

//get filename
int namebufferlen = data[20] * 2;
byte[] filenameBuffer = new byte[namebufferlen];
for (int i = 0; i < filenameBuffer.Length; i++)
{
filenameBuffer[i] = data[24 + i];
}

char[] asciiChars = UnicodeEncoding.Unicode.GetChars(filenameBuffer);

string filename = new string(asciiChars);

filename = filename.Substring(0, filename.Length - 1);

using (System.IO.Stream st = new System.IO.MemoryStream(data))
{
long dataLengthToRead = st.Length;
Response.ContentType = "text/plain"; //Or other you need
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", filename));
//Response.AddHeader("Content-Disposition", "attachment; filename=\"" + theFileName + "\"");
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
Int32 lengthRead = st.Read(buffer, 0, blockSize);
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Flush();
Response.Close();
}
Response.End();
}


Saludos,

miércoles, 24 de noviembre de 2010

Como aumentar el tamaño a un disgo de Virtual Box

Para los que nos dedicamos al desarrollo de sharepoint estamos acostumbrados a las maquinas virtuales. Ahora con la salida de Sharepoint 2010, que solo corre en 64, una de las opciones es utilizar virtual box. El problema es que los discos no pueden crecer. A continuación les presento una solución para aumentar el tamaño del disco.

1.- Primero hay que descargar la siguiente utileria SystemRescueCd-x86-1.6.3 (http://www.sysresccd.org/Download).

2.- Hay que generar un nuevo disco duro con el tamaño que requerimos.

3.- Modificamos la maquina virtual para que tenga como 2 disco, el que creamos en el paso 2, y agregamos el iso que descargamos en el paso 1.

4.- Una vezque arranque la maquina virtual, tecleamos startx. Una vez que aparezca la terminal, tecleamos gparted.

5.- Ya dentro de gparted, copiamos todo el disco duro en el nuevo, ajustando para que el tamaño ya sea mayor, y para finalizar seleccionamos la opción “Apply”.

6.- Una vez que termine el proceso. seleccionamos la partición de sistema, y seleccionamos la bandera de “boot”.

7.- Salimos del gparted y apagamos la maquina.

8.- Configuramos la maquina virtual para que ya solo tenga el disco más grande y quitamos la utileria (el iso del paso 1), y ponemos el iso del disco de instalación del sistema operativo.

9.- Arrancamos la maquina e iniciamos el proceso de instalación, pero seleccionamos la opción reparar, y seleccionamos la opción de Command.

10.- Entramos al directorio “X:\sources\recovery\”

11.- Ejecutamos “StartRep.exe”. Y esperamoss que se realice todo el proceso de validación de discos.

12.- Reiniciamos y arrancara como nueva nuestra maquina virtual con un disco más grande.

Saludos,

martes, 26 de octubre de 2010

Hacer que un highslide de tipo iframe se recargue cada vez que se abre

Estoy usando highslide para abrir algunas páginas emergente en Sharepoint. El problema que tenía era que cuando abria por segunda vez un highslide de tipo iframe, la página ya no la recargaba, mostraba la información como la primera vez. Por requerimientos, necesitaba que se refrescara cada que se abriera, asi que me di a la tarea de buscar como hacerlo, y encontre que es muy sencillo, solo hay que modificar la propiedad preservecontent en false, y de esta manera cada que se abre la página se refresca. La propiedad queda así:

hs.preserveContent = false;

Espero les sirva.

SPContex null en un Web Service

El día de hoy me estado topando con un error al momento de querer hacer uso del SPContext, dentro de un web service, el objecto viene nullo. Lo que se me hacía más rato es que si lo debbugueaba el error desaparecía. Por lo que me puse a hacer pruebas, y encontre que mi problema es que estaba usando el SPContext, dentro de un SPSecurity.RunWithElevatedPrivileges. Si el context lo utilizo fuera de dicha sentencia corre sin ningún problema. La explicación es que al momento de yo correr con Privilegios elevados, el contexto cambia, por que automaticamente se corre con otra cuenta, es por eso que el context se pone nullo. Así que la solución es sacar el id del sitio y del web, y dentro de la sentencia de privilegios elevados, generar nuevas instancias con los ids.
Espero que les sirva el post y les evite perdida de tiempo :S.
Saludos,

miércoles, 20 de octubre de 2010

Utilizar infopath (content type) en la edición de tareas

Ya tenía mucho que no posteaba, pero hoy quiero compartirles con un problema que me estaba quitando el sueño. El problema es si quería utilizar una forma de infopath para la edisión de tareas. Hasta ahi no hay problema, el detalle es que necesitaba agregar un custom type para agregar columnas que necesitaba que estuvieran en la tarea. Para no hacerles el cuento largo, lo que se necesita hacer es muy sencillo, generar un contenttype, que tenga en un principio el id, del contenttype "OffWFCoommon", que es la tarea por default que usa sharepoint. Posteriormente le concatenamos un 00, y el id de nuestro nuevo ContentType. Ese mismo lo ponemos en el "TaskListContentTypeID" del xml de configuración del flujo.

Saludos

viernes, 23 de julio de 2010

Trying to use an SPWeb object that has been closed or disposed and is no longer valid.

Buen día, les platico de algo muy común al momento de utilizar los objetos de tipo "SPSite" y "SPWeb". Cuando aparece la siguiente excepción "Trying to use an SPWeb object that has been closed or disposed and is no longer valid.", es muy facil de resolver, al menos en los casos que me a tocado ver. El problema se presenta al utilizar el siguiente código:

using (SPWeb ospWeb = SPContext.Current.Web)
{
Lógica de negocio.
}

Y la solución es no utilizar dentro de using los objetos que se obtienen del contexto, ya que al finalizar se le hace un dispose al objeto y como es el current, no lo permite, ahi es donde viene la excepción.

Saludos,

lunes, 28 de junio de 2010

Configuración de un proxy en un sitio de sharepoint

Estabamos teniendo problemas al momento de que uno de nuestros sitios se conectaba a un web services externo. Dicho problema empezo cuando en la empresa se implemento un proxy. La solución es muy sencilla, en el web.config del sitio, agregar las siguientes lineas

y buala... todo funciona correctament...

Como validar un valor Guid

Buenas tardes.. Hay veces que necesitamos verificar si un valor es un campo de tipo guid. A continuación les coparto una función que me encontre en la red para eso...


private static Regex isGuid = new Regex(@"^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$", RegexOptions.Compiled);

internal static bool IsGuid(string candidate, out Guid output)

{

bool isValid = false;

output=Guid.Empty;

if(candidate!=null)

{

if (isGuid.IsMatch(candidate))

{

output=new Guid(candidate);

isValid = true;

}

}

return isValid;

}

Como convertir un Array a Generic List

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Program
{
static void Main()
{
// 1.
// String array

string[] s = new string[]
{
"one",
"two",
"three",
"four",
"five"
};
// 2A.
// Convert with new List constructor.

List l = new List(s);

// 2B.
List l2 = s.ToList();
}
}