<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-137424020219368372</id><updated>2011-12-02T04:33:57.145-08:00</updated><category term='wcf'/><category term='xml'/><category term='xsd2code generator'/><category term='certificates'/><category term='visual studio 2008'/><category term='MOSS 2007'/><category term='xsd'/><category term='WINDOWS 2008 SERVER'/><category term='SharePoint'/><category term='AJAX'/><category term='Pex'/><category term='IIS'/><category term='WSS'/><category term='Reflexiones'/><category term='ASP.NET'/><category term='visual studio'/><category term='c#'/><category term='MSS 2010'/><category term='jquery'/><category term='PowerShell'/><category term='css'/><category term='Linq'/><category term='visual studio 2010'/><category term='regular expressions'/><category term='W2K3'/><category term='JavaScript'/><category term='Unit Testing'/><category term='Certificaciones'/><category term='.NET'/><category term='HTML5'/><title type='text'>El blog de Jordi Ruiz</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-2729370461212860278</id><published>2011-12-02T04:02:00.001-08:00</published><updated>2011-12-02T04:02:59.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>IEnumerable en vez de List para propiedades</title><content type='html'>&lt;p align="justify"&gt;Hoy toca un post muy sencillo y básico pero que puedes preguntarte en algunas ocasiones.&lt;/p&gt;  &lt;p align="justify"&gt;Hoy le he hecho una pregunta a mi amigo y maestro Pedro Santos que me estaba rondando por la cabeza, ¿por qué exponer una propiedad como IEnumerable en vez de List, si yo internamente la voy a definir como una List?&lt;/p&gt;  &lt;p align="justify"&gt;Su respuesta ha sido muy clarificadora:&lt;/p&gt;  &lt;p align="justify"&gt;Al exponerla como IEnumerable tu no expones (encapsulas) su estructura interna, además así limitas las operaciones a realizar con esta propiedad y puedes aplicar las reglas de negocio que te interesen, como por ejemplo, que tenga un cierto comportamiento concreto al añadir un nuevo elemento a la lista.&lt;/p&gt;  &lt;p align="justify"&gt;Si tu expones una propiedad como List, también le estas exponiendo la opción de añadir sin que tu controles como se han de añadir estos elementos a tu colección. &lt;/p&gt;  &lt;p align="justify"&gt;Pues bueno, a partir de ahora, todas mis colecciones irán como IEnumerable y cuando me interese le expondré el método AddNewFooItem(FooItem item). Por último, lo ideal también sería exponer el setter de la lista como private o protected, para que no puedan “settearte” una nueva colección.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-2729370461212860278?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/2729370461212860278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=2729370461212860278' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2729370461212860278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2729370461212860278'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/12/ienumerable-en-vez-de-list-para.html' title='IEnumerable en vez de List para propiedades'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1908289105014792928</id><published>2011-11-03T04:31:00.001-07:00</published><updated>2011-11-03T04:35:37.693-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='certificates'/><title type='text'>Llamando a un web service sobre https (ssl) desde sharepoint 2010</title><content type='html'>&lt;p align="justify"&gt;He estado trabajando en un proyecto donde teniamos que integrar una aplicación externa, esta integración la hacemos mediante servicios webs. Estos servicios webs contienen datos privados por lo que están securizados mediante certificados (el mensaje) y además la información viaja por un medio seguro, es decir, ssl.&lt;/p&gt;  &lt;p align="justify"&gt;Bueno hasta aquí nada nuevo, hice mis pruebas con un proyecto de test, colocando los certificados en los diferentes repositiorios, dependiendo de su función: Trusted Root Certification Authorities, Intermediate Certification Authorities, etc. y todo funcionaba a las mil maravillas.&lt;/p&gt;  &lt;p align="justify"&gt;Pero esta llamada al servicio web ha de ser hecha desde un entorno SharePoint 2010, pensé que esto no sería ningún problema pues en el otro tipo de proyecto me funcionaba correctamente, pero no fue así, de pronto observé que la llamada al servicio web me estaba devolviendo la siguiente excepción:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Type&lt;/strong&gt;: System.Net.WebException    &lt;br /&gt;&lt;strong&gt;Message&lt;/strong&gt;: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.    &lt;br /&gt;&lt;strong&gt;InnerException&lt;/strong&gt;: The remote certificate is invalid according to the validation procedure.&lt;/p&gt;  &lt;p align="justify"&gt;Esta excepción me extraño mucho, pues si yo accedía mediante el browser a la url del web service me decía que el certificado estaba correctamente instalado.&lt;/p&gt;  &lt;p align="justify"&gt;Entonces empecé a googlear un poco y leía gente que decía de crear un bypass, mediante la creación de tu propia clase CertificatePolicy que implemente la interfaz ICertificatePolicy, y en el método CheckValidationResult devolver true siempre para que se salte la validación.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy&lt;br /&gt;{&lt;br /&gt; public TrustAllCertificatePolicy()&lt;br /&gt; {}&lt;br /&gt;&lt;br /&gt; public bool CheckValidationResult(ServicePoint sp,&lt;br /&gt;  X509Certificate cert,WebRequest req, int problem)&lt;br /&gt; {&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;La llamada a esta clase se tendría que hacer justo antes de la llamada a tu servicio web.&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();&lt;/pre&gt;&lt;br /&gt;&lt;p align="justify"&gt;He visto en muchos foros y blogs que esto lo daban como la solución correcta, pero ojo, aquí estamos aceptando cualquier cosa que nos esté enviando el servidor sin validar el certificado!!&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Por lo tanto seguí buscando y el problema reside en la forma que tiene sharepoint de obtener los certificados raíz, que parece ser que usa su propio repositorio de certificados en vez de usar el de la propia máquina. Por lo que tendremos que añadir estos certificados raíz de confianza en el repositorio de sharepoint. Para hacerlo seguiremos los siguientes pasos:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Ir a la administración central&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Ir a security&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Manage trust&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Aquí es donde instalaremos los certificados raíz que nos interese, pulsando new, buscando el certificado y poniéndole un nombre.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p align="justify"&gt;Esta información la obtuve del siguiente blog:&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;a title="http://blog.mattsampson.net/index.php/calling-a-webservice-over-ssl-in-sharepoint-ssl?blog=1" href="http://blog.mattsampson.net/index.php/calling-a-webservice-over-ssl-in-sharepoint-ssl?blog=1"&gt;http://blog.mattsampson.net/index.php/calling-a-webservice-over-ssl-in-sharepoint-ssl?blog=1&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1908289105014792928?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1908289105014792928/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1908289105014792928' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1908289105014792928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1908289105014792928'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/11/llamando-un-web-service-sobre-https-ssl.html' title='Llamando a un web service sobre https (ssl) desde sharepoint 2010'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-6312395255000747112</id><published>2011-06-09T09:53:00.001-07:00</published><updated>2011-06-10T02:34:27.100-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><title type='text'>WCF tools</title><content type='html'>&lt;p align="justify"&gt;Esta semana &lt;strike&gt;me he estado peleando&lt;/strike&gt; he estado haciendo una integración con un proveedor de servicios para poder consumir su servicio una aplicación que estamos desarrollando. Lo primero que hemos de saber es que toda integración suele &lt;strike&gt;dar muchos dolores de cabeza&lt;/strike&gt; ser un bonito reto.&lt;/p&gt;  &lt;p align="justify"&gt;En nuestro caso teníamos que consumir un servicio elaborado con java axis2. Este servicio tenia que tener seguridad a nivel de transporte (mediante certificado) y seguridad a nivel de mensaje (también mediante certificado), más concretamente en nuestro caso debía contener una firma.&lt;/p&gt;  &lt;p align="justify"&gt;Cuando hacemos este tipo de integraciones lo más normal es que no nos salga a la primera y que tengamos que ver que mensajes estamos enviando al servidor, ya que los errores que nos pueden devolver el servidor pueden ser poco intuitivos. Y he aquí donde realmente empieza el contenido de este post, o sea, que herramientas podemos usar para ver lo que estamos enviando.&lt;/p&gt;  &lt;p align="justify"&gt;Una de las primeras herramientas que podemos utilizar es el tracing de Windows Communication Foundation. En la siguiente página de las MSDN podemos ver como configurar esto:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms733025.aspx" href="http://msdn.microsoft.com/en-us/library/ms733025.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms733025.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En mi caso la configuración ha sido la siguiente:&lt;/p&gt;  &lt;p align="justify"&gt;Justo antes del cierre del tal configuration (&amp;lt;/configuration&amp;gt;)&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;  &amp;lt;sources&amp;gt;&lt;br /&gt;    &amp;lt;source name=&amp;quot;System.ServiceModel&amp;quot;&lt;br /&gt;            switchValue=&amp;quot;Information, ActivityTracing&amp;quot;&lt;br /&gt;            propagateActivity=&amp;quot;true&amp;quot; &amp;gt;&lt;br /&gt;      &amp;lt;listeners&amp;gt;&lt;br /&gt;        &amp;lt;add name=&amp;quot;xml&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/listeners&amp;gt;&lt;br /&gt;    &amp;lt;/source&amp;gt;&lt;br /&gt;    &amp;lt;source name=&amp;quot;System.ServiceModel.MessageLogging&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;listeners&amp;gt;&lt;br /&gt;        &amp;lt;add name=&amp;quot;xml&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/listeners&amp;gt;&lt;br /&gt;    &amp;lt;/source&amp;gt;&lt;br /&gt;  &amp;lt;/sources&amp;gt;&lt;br /&gt;  &amp;lt;sharedListeners&amp;gt;&lt;br /&gt;    &amp;lt;add name=&amp;quot;xml&amp;quot;&lt;br /&gt;         type=&amp;quot;System.Diagnostics.XmlWriterTraceListener&amp;quot;&lt;br /&gt;         initializeData=&amp;quot;C:\logs\CommandLineSTS.svclog&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/sharedListeners&amp;gt;&lt;br /&gt;&amp;lt;/system.diagnostics&amp;gt;&lt;/pre&gt;&lt;p&gt;Y esto dentro del nodo system.serviceModel:&lt;/p&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;!-- add trace logging --&amp;gt;&lt;br /&gt;&amp;lt;diagnostics wmiProviderEnabled=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;messageLogging&lt;br /&gt;       logEntireMessage=&amp;quot;true&amp;quot;&lt;br /&gt;       logMalformedMessages=&amp;quot;true&amp;quot;&lt;br /&gt;       logMessagesAtServiceLevel=&amp;quot;true&amp;quot;&lt;br /&gt;       logMessagesAtTransportLevel=&amp;quot;true&amp;quot;&lt;br /&gt;       maxMessagesToLog=&amp;quot;3000&amp;quot;&lt;br /&gt;    /&amp;gt;&lt;br /&gt;&amp;lt;/diagnostics&amp;gt;&lt;/pre&gt;&lt;p align="justify"&gt;Otras herramientas que podemos usar para ver que se esa enviando son HTTP monitors, en mi caso he utilizado dos, destacando el último de los que menciono a continuación:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Fiddler: &lt;a title="http://www.fiddler2.com/fiddler2/" href="http://www.fiddler2.com/fiddler2/"&gt;http://www.fiddler2.com/fiddler2/&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;HTTP Analyzer V6: &lt;a title="http://www.ieinspector.com/httpanalyzer/" href="http://www.ieinspector.com/httpanalyzer/"&gt;http://www.ieinspector.com/httpanalyzer/&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/-igcspdsZc6U/TfHF3O6nE_I/AAAAAAAAAFk/r0bCzNTIhSI/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-JTCdleDPt34/TfHF4DwGHfI/AAAAAAAAAFo/m8sspCfw-ho/image_thumb%25255B2%25255D.png?imgmax=800" width="453" height="328" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Otra de las cosas con las que nos entretendremos mucho es configurando nuestro service model a nivel de configuración o programándolo con código. Para ello nada mejor que las msdn y como punto de partida esta seria una buena página:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms733103.aspx" href="http://msdn.microsoft.com/en-us/library/ms733103.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms733103.aspx&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Tampoco podemos olvidar las herramientas de WCF que se nos ofrecen con nuestro visual studio, un resumen de ellas son las que indica la msdn en la siguiente página: &lt;/p&gt;&lt;p align="justify"&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms732015(v=vs.90).aspx" href="http://msdn.microsoft.com/en-us/library/ms732015(v=vs.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms732015(v=vs.90).aspx&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Seguramente y debido a las peculiaridades de cada integración, no nos valdrá con las típicas configuraciones de bindings que nos ofrece el framework por defecto, es decir BasicHttpBinding o WSHttpBinding, entre otras, y tengamos que echar mano de custombindings, ahora bien no esta mal partir de uno de los bindings de los que disponemos, para poder hacer esto podemos convertir cualquiera de estos bindings a custom bindings utilizando por ejemplo una herramienta que expone en su blog un crack en la materia como es Yaron Naveh. &lt;/p&gt;&lt;p align="justify"&gt;&lt;a title="http://webservices20.blogspot.com/2009/08/bindingbox-convert-wcf-bindings.html" href="http://webservices20.blogspot.com/2009/08/bindingbox-convert-wcf-bindings.html"&gt;http://webservices20.blogspot.com/2009/08/bindingbox-convert-wcf-bindings.html&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Sobre el tema de configuración, decir que antes de pensar en desarrollar nosotros una solución como dirian los anglosajones “from scratch”, mirar todas las posibilidades que nos ofrecen las configuraciones de los bindings, seguro que encontraremos alguna que satisface nuestras necesidades. &lt;/p&gt;&lt;p align="justify"&gt;En caso de que nuestra solución sea muy compleja y no podamos obtenerla con lo que nos ofrece wcf out of the box, siempre podemos pensar en extender estas funcionalidades ya que wcf es un framework de comunicación altamente extensible. Por ejemplo, podemos crear un message inspector o un message encoder (derivando de la interfaz IClientMessageInspector o de la clase MessageEncoder, respectivamente). Para estas posibles extensiones que podamos hacer sobre WCF es interesante descargarnos los ejemplos que encontramos en la msdn, más concretamente en:&lt;/p&gt;&lt;p align="justify"&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms751514(v=VS.90).aspx" href="http://msdn.microsoft.com/en-us/library/ms751514(v=VS.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms751514(v=VS.90).aspx&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;Aquí podemos encontrar ejemplos divididos en las siguientes categorías:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Basic&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Extensibility&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Scenario&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Setup&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Tools&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-6312395255000747112?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/6312395255000747112/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=6312395255000747112' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6312395255000747112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6312395255000747112'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/06/tools-for-wcf.html' title='WCF tools'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-JTCdleDPt34/TfHF4DwGHfI/AAAAAAAAAFo/m8sspCfw-ho/s72-c/image_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-460261854385691611</id><published>2011-04-18T07:49:00.001-07:00</published><updated>2011-04-18T07:49:31.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Alternativa a .NET Reflector</title><content type='html'>&lt;p&gt;Hoy toca una entrada muy cortita. &lt;/p&gt;  &lt;p&gt;El otro día estuve buscando una alternativa open source a la famosa herramienta de Redgate .NET Reflector y encontré una que me ha gustado mucho. Al igual que .NET Reflector, se trata de una herramienta que nos permite navegar por los ensamblados y decompilar codigo IL.&lt;/p&gt;  &lt;p&gt;Como podéis apreciar en la siguiente imagen, la interfaz es identica a .NET Refector, por lo que no nos costará nada acostumbrarnos a trabajar con esta nueva herramienta.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Pr5OkOx_Vdo/TaxPavKJaNI/AAAAAAAAAFc/J-Tp8pdxU9U/s1600-h/ILSpy%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ILSpy" border="0" alt="ILSpy" src="http://lh6.ggpht.com/_Pr5OkOx_Vdo/TaxPbK0lDqI/AAAAAAAAAFg/DYpolNv_wWA/ILSpy_thumb%5B2%5D.png?imgmax=800" width="414" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Por último os dejo la url de la herramienta:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://wiki.sharpdevelop.net/ilspy.ashx" href="http://wiki.sharpdevelop.net/ilspy.ashx"&gt;http://wiki.sharpdevelop.net/ilspy.ashx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-460261854385691611?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/460261854385691611/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=460261854385691611' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/460261854385691611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/460261854385691611'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/04/alternativa-net-reflecto.html' title='Alternativa a .NET Reflector'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_Pr5OkOx_Vdo/TaxPbK0lDqI/AAAAAAAAAFg/DYpolNv_wWA/s72-c/ILSpy_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8785784896039880713</id><published>2011-03-31T07:31:00.001-07:00</published><updated>2011-03-31T09:10:52.762-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='WINDOWS 2008 SERVER'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio 2010'/><title type='text'>WCF: Windows Authentication and Impersonation</title><content type='html'>&lt;p align="justify"&gt;Voy a intentar mostrar todo el procedimiento de poder exponer un servicio WCF alojado en un IIS con autenticación windows, esto es una tarea bien sencilla, pero muchas veces si “googleamos” un poco, nos encontramos con diferentes entradas en los foros y cada uno intenta hacerlo de una forma, al final acabas pensando que es una tarea dificil cuando en realidad no lo es. Acto seguido expondré como poder realizar una impersonación con el usuario que ha llamado a nuestro servicio.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Parte uno: creación WCF Service y publicación IIS&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Lo primero que haremos será crear un proyecto de tipo WCF Service Application, en este proyecto tendremos nuestra interfaz que define el Service Contract con un método que define nuestro Operation Contract:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System.ServiceModel;&lt;br /&gt;&lt;br /&gt;namespace FooWcfService&lt;br /&gt;{&lt;br /&gt;    [ServiceContract]&lt;br /&gt;    public interface IFooWcfService&lt;br /&gt;    {&lt;br /&gt;        [OperationContract]&lt;br /&gt;        string FooOperation();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Ahora modificaremos la clase que implementa nuestro Service Contract (en este tipo de proyectos, esta clase esta en el code behind del fichero .svc), en nuestro caso algo parecido a esto:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;namespace FooWcfService&lt;br /&gt;{&lt;br /&gt;    public class FooWcfService : IFooWcfService&lt;br /&gt;    {&lt;br /&gt;        public string FooOperation()&lt;br /&gt;        {&lt;br /&gt;            return &amp;quot;Hello World&amp;quot;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Muy bien, una vez tenemos implementado lo que hará nuestro servicio, hemos de empezar a tratar el tema de seguridad, en nuestro caso hemos dicho que tendremos autenticación windows. Para ello, tendremos que modificar el fichero web.config, y poner el siguiente binding:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;bindings&amp;gt;&lt;br /&gt;      &amp;lt;basicHttpBinding&amp;gt;&lt;br /&gt;        &amp;lt;binding&amp;gt;&lt;br /&gt;          &amp;lt;security mode=&amp;quot;TransportCredentialOnly&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;transport clientCredentialType=&amp;quot;Windows&amp;quot; /&amp;gt;&lt;br /&gt;          &amp;lt;/security&amp;gt;&lt;br /&gt;        &amp;lt;/binding&amp;gt;&lt;br /&gt;      &amp;lt;/basicHttpBinding&amp;gt;&lt;br /&gt;    &amp;lt;/bindings&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Bueno, para que no haya dudas expondré todo el web.config:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;    &amp;lt;bindings&amp;gt;&lt;br /&gt;      &amp;lt;basicHttpBinding&amp;gt;&lt;br /&gt;        &amp;lt;binding&amp;gt;&lt;br /&gt;          &amp;lt;security mode=&amp;quot;TransportCredentialOnly&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;transport clientCredentialType=&amp;quot;Windows&amp;quot; /&amp;gt;&lt;br /&gt;          &amp;lt;/security&amp;gt;&lt;br /&gt;        &amp;lt;/binding&amp;gt;&lt;br /&gt;      &amp;lt;/basicHttpBinding&amp;gt;&lt;br /&gt;    &amp;lt;/bindings&amp;gt;&lt;br /&gt;    &amp;lt;behaviors&amp;gt;&lt;br /&gt;      &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;        &amp;lt;behavior&amp;gt;&lt;br /&gt;          &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;          &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/behavior&amp;gt;&lt;br /&gt;      &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;    &amp;lt;/behaviors&amp;gt;&lt;br /&gt;    &amp;lt;services&amp;gt;&lt;br /&gt;      &amp;lt;service name=&amp;quot;FooWcfService.IFooWcfService&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;endpoint binding=&amp;quot;basicHttpBinding&amp;quot; contract=&amp;quot;FooWcfService.IFooWcfService&amp;quot; /&amp;gt;&lt;br /&gt;      &amp;lt;/service&amp;gt;&lt;br /&gt;    &amp;lt;/services&amp;gt;&lt;br /&gt;  &amp;lt;/system.serviceModel&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Ahora sí, ya estamos preparados para publicar nuestro servicio en un IIS. Supongamos que ya tenemos un IIS instalado, y que tenemos un Default Web Site, entonces sólo tendremos que hacer botón derecho sobre nuestro proyecto y publish.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_Pr5OkOx_Vdo/TZSQKPE0MnI/AAAAAAAAAFM/t-rPG9v3uWE/s1600-h/publish%20web%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="publish web" border="0" alt="publish web" src="http://lh3.ggpht.com/_Pr5OkOx_Vdo/TZSQKu2Yh1I/AAAAAAAAAFQ/8RcPwfhMLZ4/publish%20web_thumb.png?imgmax=800" width="178" height="244" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Por último tendremos que habilitar en el IIS nuestra seguridad windows, vamos a nuestra web site y suponiendo que tengamos la vista Feature View, hacemos click sobre Authentication y habilitamos Windows Authentication y deshabilitamos Anonymous Authentication.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_Pr5OkOx_Vdo/TZSQLRUrB7I/AAAAAAAAAFU/co05shbeN2c/s1600-h/authentication%20iis%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="authentication iis" border="0" alt="authentication iis" src="http://lh4.ggpht.com/_Pr5OkOx_Vdo/TZSQL-rQ-jI/AAAAAAAAAFY/42t4QV9r0_w/authentication%20iis_thumb.png?imgmax=800" width="244" height="160" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;em&gt;Parte dos: Impersonación&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Para esta parte haremos un pequeño ejemplo de una aplicación cliente (Console application) que consuma nuestro servicio. Y cambiaremos un poco nuestra operación, para que tenga sentido la impersonación. Imaginemos que queremos tener un acceso a un recurso (por ejemplo acceso de escritura en disco) y para ello hemos de garantizar que el usuario que llama a nuestro servicio tenga permisos para ello, esto sería un claro ejemplo de impersonación. No se hable más, vamos a poner un pequeño ejemplo de ello:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;"&gt;using System;&lt;br /&gt;using System.IO;&lt;br /&gt;&lt;br /&gt;namespace FooWcfService&lt;br /&gt;{&lt;br /&gt;    public class FooWcfService : IFooWcfService&lt;br /&gt;    {&lt;br /&gt;        public void FooOperation()&lt;br /&gt;        {&lt;br /&gt;            StreamWriter fileWriter = null;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                &lt;br /&gt;                fileWriter = File.CreateText(@&amp;quot;C:\dummy.txt&amp;quot;);&lt;br /&gt;                fileWriter.Write(&amp;quot;Hello world&amp;quot;);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            catch(Exception ex)&lt;br /&gt;            {&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if(fileWriter != null)&lt;br /&gt;                    fileWriter.Close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Para configurar la impersonación lo podemos hacer de modo imperativo o de modo declarativo, &lt;a href="http://msdn.microsoft.com/en-us/library/ms730088.aspx"&gt;aquí podemos ver la explicación&lt;/a&gt;, nosotros en el ejemplo, usaremos el modo declarativo.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Este modo es el más simple, simplemente hemos de poner el siguiente atributo en la implementación de nuestro operation contract:&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;[OperationBehavior Impersonation=ImpersonationOption.Required)] &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Si ejecutamos nuestra aplicación de consola, sin esta impersonación, lo más seguro es que nos aparezca un mensaje como el que apunto a continuación:&lt;br /&gt;&lt;br /&gt;&lt;font color="#ff0000"&gt;Access to the path 'C:\dummy.txt' is denied.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;En cambio, si ponemos el attributo anterior, nos vuelve a dar una excepción pero ahora es diferente:&lt;br /&gt;&lt;br /&gt;&lt;font color="#ff0000"&gt;Either a required impersonation level was not provided, or the provided impersonation level is invalid. &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Este mensaje nos esta diciendo, que nosotros requeriamos un cierto nivel de impersonación en nuestro código, pero que no se esta cumpliendo con la llamada desde el cliente.&lt;br /&gt;&lt;br /&gt;Por lo tanto, el cliente cuando haga una llamada a nuestro servicio, ha de indicar que permite la impersonación.&lt;br /&gt;&lt;br /&gt;Pongo ahora en código completo del cliente, done permitimos esta impersonación.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;"&gt;using System;&lt;br /&gt;using System.Security.Principal;&lt;br /&gt;using FooConsoleApplication.FooWcfService;&lt;br /&gt;&lt;br /&gt;namespace FooConsoleApplication&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            FooWcfServiceClient client = null;&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                client = new FooWcfServiceClient();&lt;br /&gt;                client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;&lt;br /&gt;                var result = client.FooOperation();&lt;br /&gt;                &lt;br /&gt;                Console.Write(result);&lt;br /&gt;                Console.Read();&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                if(client!= null)&lt;br /&gt;                {&lt;br /&gt;                    client.Close();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8785784896039880713?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8785784896039880713/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8785784896039880713' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8785784896039880713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8785784896039880713'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/03/wcf-windows-authentication-and.html' title='WCF: Windows Authentication and Impersonation'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_Pr5OkOx_Vdo/TZSQKu2Yh1I/AAAAAAAAAFQ/8RcPwfhMLZ4/s72-c/publish%20web_thumb.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8795005631656585859</id><published>2011-01-28T01:21:00.001-08:00</published><updated>2011-01-28T01:21:06.231-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio 2010'/><title type='text'>DataContracts and Constructors</title><content type='html'>&lt;p align="justify"&gt;Imaginemos el siguiente escenario, tengo una clase que será un DataContract utilizado en un método de un servicio WCF y queremos inicializar una variable de esta clase en el constructor.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;namespace FooNamespace&lt;br /&gt;{&lt;br /&gt;    [ServiceContract]&lt;br /&gt;    public interface Foo&lt;br /&gt;    {&lt;br /&gt;        [OperationContract]&lt;br /&gt;        void StartProcess(FooData dataEntrada);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [DataContract]&lt;br /&gt;    public class FooData&lt;br /&gt;    {&lt;br /&gt;        [DataMember]&lt;br /&gt;        public string FooProperty { get; set; }&lt;br /&gt;&lt;br /&gt;        protected string InitializedData {get; set;}&lt;br /&gt;&lt;br /&gt;        public FooData()&lt;br /&gt;        {&lt;br /&gt;            InitializedData = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Bueno pues hemos de ser consciente que esa llamada al constructor no se llamará nunca durante la deserialización.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Por lo que si queremos simular esto podemos usar los &lt;a href="http://msdn.microsoft.com/en-us/library/ms733734.aspx"&gt;Serialization Callbacks&lt;/a&gt;. De esta forma en el servidor podremos tener inicializada esa clase con el valor que queramos.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;namespace FooNamespace&lt;br /&gt;{&lt;br /&gt;    [ServiceContract]&lt;br /&gt;    public interface Foo&lt;br /&gt;    {&lt;br /&gt;        [OperationContract]&lt;br /&gt;        void StartProcess(FooData dataEntrada);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [DataContract]&lt;br /&gt;    public class FooData&lt;br /&gt;    {&lt;br /&gt;        [DataMember]&lt;br /&gt;        public string FooProperty { get; set; }&lt;br /&gt;&lt;br /&gt;        protected string InitializedData {get; set;}&lt;br /&gt;&lt;br /&gt;        [OnDeserializing]&lt;br /&gt;        public void Initialize(StreamingContext context)&lt;br /&gt;        {&lt;br /&gt;            InitializedData = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8795005631656585859?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8795005631656585859/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8795005631656585859' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8795005631656585859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8795005631656585859'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/01/datacontracts-and-constructors.html' title='DataContracts and Constructors'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1723534433347119971</id><published>2011-01-27T06:44:00.001-08:00</published><updated>2011-01-27T09:08:40.826-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio 2010'/><title type='text'>Data Contract Known Types</title><content type='html'>&lt;p align="justify"&gt;Hoy me he encontrado con un problemilla (bueno más que un problemilla era que desconocía la manera correcta de hacerlo) a la hora de desarrollar un sevicio WCF.&lt;/p&gt;  &lt;p align="justify"&gt;El problema era que quería construir un método que recibía por parametro un objeto de tipo x, pero quería ofrecer al cliente la opción de poder pasar como parámetro objetos derivados de tipo x que había construido. Yo habia declarado todas estas clases con el atributo [DataContract], pero parece ser que esto no era suficiente, sino que había que especificar en la clase base, que también podiamos pasar objetos derivados usando el atributo &lt;a href="http://msdn.microsoft.com/en-us/library/ms730167.aspx"&gt;[KnownType(typeof(claseBase)]&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Aquí va la solución:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System;&lt;br /&gt;using System.Runtime.Serialization;&lt;br /&gt;using System.ServiceModel;&lt;br /&gt;&lt;br /&gt;namespace FooNamespace&lt;br /&gt;{&lt;br /&gt;    [ServiceContract]&lt;br /&gt;    public interface IFoo&lt;br /&gt;    {&lt;br /&gt;        [OperationContract]&lt;br /&gt;        void DoSomething(FooDataBase dataEntrada);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [DataContract]&lt;br /&gt;    [KnownType(typeof(FooDataDerived))]&lt;br /&gt;    public class FooDataBase&lt;br /&gt;    {&lt;br /&gt;        [DataMember]&lt;br /&gt;        public string FooProperty1 { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [DataContract]&lt;br /&gt;    public class FooDataDerived:FooDataBase&lt;br /&gt;    {&lt;br /&gt;        [DataMember]&lt;br /&gt;        public string FooProperty2 { get; set; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1723534433347119971?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1723534433347119971/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1723534433347119971' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1723534433347119971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1723534433347119971'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/01/data-contract-known-types.html' title='Data Contract Known Types'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8757756505999656793</id><published>2011-01-26T06:49:00.001-08:00</published><updated>2011-01-26T09:29:13.627-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Pex'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio 2010'/><title type='text'>Unit Testing con Pex and Moles</title><content type='html'>&lt;p&gt;Siguiendo la llamada de mi compañero &lt;a href="http://geeks.ms/blogs/lruiz/"&gt;Luis Ruiz&lt;/a&gt;, voy a entrar un poco en el mundo de Pex and Moles. A ver que es lo que me encuentro. Para ello empezaremos con una mini guia de tutoriales que voy a ir leyendo. Tal y como los vaya leyendo intentaré postear un pequeño resumen y las prácticas que voy realizando.&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://research.microsoft.com/en-us/projects/pex/getstarted.pdf"&gt;Getting Started with Microsoft Pex and Moles&lt;/a&gt;: Aquí podemos ver lo que yo llamo un meta-tutorial, es decir, un tutorial de tutoriales, o más bien un tutorial que nos dice los siguientes pasos a realizar y que tutoriales podemos seguir.&lt;/p&gt;  &lt;p&gt;En definitiva lo primero que deberiamos hacer es instalarnos &lt;a href="http://research.microsoft.com/en-us/projects/pex/downloads.aspx"&gt;Pex and Moles&lt;/a&gt; y continuar con otros tutoriales. Lo que me ha gustado es que nos muestra un conjunto de conceptos básicos sobre unit testing en forma de glosario de términos que puede ser muy útil para los neófitos, algunos de estos conceptos serian:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;code coverage &lt;/li&gt;    &lt;li&gt;integration test &lt;/li&gt;    &lt;li&gt;mock &lt;/li&gt;    &lt;li&gt;mole type &lt;/li&gt;    &lt;li&gt;stub type &lt;/li&gt;    &lt;li&gt;… &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;- &lt;a href="http://research.microsoft.com/en-us/projects/pex/pexandcontracts.pdf"&gt;Getting Started with Microsoft Code Contracts and Microsoft Pex&lt;/a&gt;: Este tutorial esta dividido en dos secciones, una primera en la que crearemos un proyecto en Visual Studio (una clase llamada StringExtensions con un método estático que devuelva un substring, desde el inicio hasta la primera aparición de otro string que nos pasen, también por parámetro) y ejecutamos lo que se conoce como Pex Explorations, esto lo que hace es ejecutar nuestro código muchas veces con diferentes valores de entrada, entonces se nos muestra una tabla con las diferentes salidas o excepciones de nuestro código. Para hacer eso sólo tendremos que hacer botón derecho en la función que queramos probar y hacer click en Run Pex.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Pr5OkOx_Vdo/TUBXK5rECMI/AAAAAAAAAE4/sAeAVZb2UlY/s1600-h/image%5B5%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_Pr5OkOx_Vdo/TUBXLemambI/AAAAAAAAAE8/RHbi-n_CcGY/image_thumb%5B1%5D.png?imgmax=800" width="244" height="151" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vemos que lo que hace Pex es intentar crear diferentes combinaciones de parámetros de entrada para cubrir la mayor parte de nuestro código. Entonces hace diferentes llamadas a nuestro método, pasándole como parámetros los que ha calculado, acto seguido nos muestra una tabla con estos resultados.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Pr5OkOx_Vdo/TUBY2x5k-iI/AAAAAAAAAFA/x8IcDb97kCk/s1600-h/image%5B10%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_Pr5OkOx_Vdo/TUBY3v2bmnI/AAAAAAAAAFE/BWe7dKi4HMg/image_thumb%5B4%5D.png?imgmax=800" width="460" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8757756505999656793?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8757756505999656793/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8757756505999656793' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8757756505999656793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8757756505999656793'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2011/01/unit-testing-con-pex-and-moles.html' title='Unit Testing con Pex and Moles'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_Pr5OkOx_Vdo/TUBXLemambI/AAAAAAAAAE8/RHbi-n_CcGY/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-947627494897131274</id><published>2010-12-16T04:42:00.001-08:00</published><updated>2010-12-16T04:42:38.826-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Obtener PublicKeyToken de una assembly</title><content type='html'>&lt;p&gt;Muchas veces, nos hemos encontrado con la necesidad de obtener el PublicKeyToken de una assembly para poderlo añadir por ejemplo a una directiva &amp;lt;%@ Page %&amp;gt; o &amp;lt;%@ Control %&amp;gt;&amp;#160; de nuestra solución, esto se consigue mediante la herramienta &lt;a href="http://msdn.microsoft.com/en-us/library/k5b5tt23(v=vs.80).aspx"&gt;sn.exe (Strong Name Tool)&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Para usar esta herramienta sería necesario abrir una consola de visual studio y ejecutar esta herramient pasándole los parámetros apropiados. Podemos automatizar este proceso usando la opción de añadir una External Tool a nuestro Visual Studio, lo podemos hacer la siguiente forma:&lt;/p&gt;  &lt;p&gt;En Visual Studio hacemos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Menú Tools &amp;gt; External Tools&lt;/li&gt;    &lt;li&gt;Pulsamos Add&lt;/li&gt;    &lt;li&gt;Title: Get &amp;amp;PublicKeyToken&lt;/li&gt;    &lt;li&gt;Command: C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\sn.exe&lt;/li&gt;    &lt;li&gt;Arguments: -Tp $(TargetPath)&lt;/li&gt;    &lt;li&gt;Marcamos la opción “Use Output Window”&lt;/li&gt;    &lt;li&gt;Pulsamos OK&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Con este procedimiento se nos ha añadido una nueva opción de menú en el menú Tools con el nombre Get PublicKeyToken. Y voilà ya podemos obtener nuestro publicKeyToken del proyecto en el que estemos situados.&lt;/p&gt;  &lt;p&gt;Fuente: &lt;a href="http://blogs.msdn.com/b/kaevans/archive/2008/06/18/getting-public-key-token-of-assembly-within-visual-studio.aspx"&gt;http://blogs.msdn.com/b/kaevans/archive/2008/06/18/getting-public-key-token-of-assembly-within-visual-studio.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-947627494897131274?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/947627494897131274/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=947627494897131274' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/947627494897131274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/947627494897131274'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/12/obtener-publickeytoken-de-una-assembly.html' title='Obtener PublicKeyToken de una assembly'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1300299638959202136</id><published>2010-12-01T01:02:00.001-08:00</published><updated>2010-12-01T01:02:51.052-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Reflection y como ser un Jedi (Parte 3)</title><content type='html'>&lt;p&gt;En el &lt;a href="http://jordiruiznet.blogspot.com/2010/12/reflection-y-como-ser-un-jedi-part-2.html"&gt;anterior post&lt;/a&gt; vimos la potencia de Reflection a la hora de preguntar por sus métodos, propiedades, variables, etc. a un ensamblado y además hubo un poco de teoría en cuanto a conceptos como MSIL, CLR, JIT, etc., eso sí, muy básica. Para más información &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Por último decir, que la potencia sin control no sirve de nada, con reflection la línea que hay entre la fuerza y el lado oscuro es muy delgada. Es decir con un par de líneas de código nos podemos saltar muchos principios de los lenguajes orientados a objetos, como por ejemplo la encapsulación. Reflection nos permitiría invocar a un constructor privado, o invocar a un método privado, o obtener las variables privadas de cualquier classe. Por eso, tenemos que ser muy conscientes de que estamos tocando con reflection. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1300299638959202136?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1300299638959202136/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1300299638959202136' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1300299638959202136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1300299638959202136'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/12/reflection-y-como-ser-un-jedi-parte-3.html' title='Reflection y como ser un Jedi (Parte 3)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8841258910230522591</id><published>2010-12-01T00:51:00.001-08:00</published><updated>2010-12-01T00:52:32.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Reflection y como ser un Jedi (Part 2)</title><content type='html'>&lt;p align="justify"&gt;&lt;strong&gt;Resumen&lt;/strong&gt;: En la entrada &lt;a href="http://jordiruiznet.blogspot.com/2010/10/reflection-y-como-ser-un-jedi-part-1.html"&gt;anterior&lt;/a&gt; vimos una definición de reflection y los namespaces necessarios, para trabajar con reflection. Más adelante se vió algunos ejemplos de cómo crear objetos y como consultar los diferentes constructores de un tipo determinado.&lt;/p&gt;  &lt;p align="justify"&gt;Hecho este pequeño recordatorio vamos a ver que más cosillas podriamos hacer con reflection y subir así un nivel en nuestro curso de Jedi, a saber, ser un Padawan.&lt;/p&gt;  &lt;p align="justify"&gt;Haciendo algún pequeño cambio a nuestro programa, podemos consultar también los métodos, propiedades y variables (fields) de nuestro código.&lt;/p&gt;  &lt;p&gt;EJEMPLO 2:    &lt;br /&gt;Vamos a ver que métodos tiene nuestra StupidClass:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;pre class="brush: csharp;"&gt;using System;&lt;br /&gt;using System.Reflection;&lt;br /&gt;&lt;br /&gt;namespace StupidNameSpace&lt;br /&gt;{&lt;br /&gt;    public class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            // Obtenemos el tipo, tenemos que pasadle todo el fully qualified name,&lt;br /&gt;            // tened en cuenta que estamos en el mismo namespace, y en el mismo assembly, sino fuera así,&lt;br /&gt;            // tendriamos que pasarle, el nombre del assembly.&lt;br /&gt;            var type = Type.GetType(&amp;quot;StupidNameSpace.StupidClass&amp;quot;);&lt;br /&gt;&lt;br /&gt;            MethodInfo[] methods = type.GetMethods();&lt;br /&gt;            foreach (MethodInfo mi in methods)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(string.Format(&amp;quot;Method name: {0}&amp;quot;,mi.Name));&lt;br /&gt;                if(mi.IsPrivate) Console.WriteLine(&amp;quot;Private&amp;quot;);&lt;br /&gt;                else Console.WriteLine(&amp;quot;Public&amp;quot;);&lt;br /&gt;                if(mi.IsStatic) Console.WriteLine(&amp;quot;Static&amp;quot;);&lt;br /&gt;                &lt;br /&gt;                if (mi.IsVirtual) Console.WriteLine(&amp;quot;Virtual&amp;quot;);&lt;br /&gt;                var parameters = mi.GetParameters();&lt;br /&gt;                if(parameters.Length &amp;gt; 0) Console.WriteLine(&amp;quot;Parameters:&amp;quot;);&lt;br /&gt;&lt;br /&gt;                foreach(ParameterInfo pi in parameters)&lt;br /&gt;                {&lt;br /&gt;                    Console.WriteLine(string.Format(&amp;quot;--&amp;gt; Parameter name: {0}&amp;quot;,pi.Name));&lt;br /&gt;                    Console.WriteLine(string.Format(&amp;quot;--&amp;gt; Parameter type: {0}&amp;quot;,pi.ParameterType));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.Read();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Cómo se puede observar no supondría ninguna complicación mostrar las propiedades utilizando el método GetProperties que devuelve un array de PropertyInfo o el mostrar los fields utilizando el método GetFields que a su vez devuelve un array de FieldInfo.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Es más, podriamos usar el método GetMethodBody() de la clase MethodInfo, que nos prové acceso a los metadatos y al MSIL del método. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Recordad MSIL significa Microsoft Intermediate Language, es el código que se genera al compilar nuestra aplicación, este código no es un lenguaje máquina en sí, bueno es un “lenguaje máquina” capaz de ser leído por el CLR (Common Language Runtime, “la máquina virtual de .NET”), éste código, será transformado en verdadero código máquina para nuestra procesador por el JIT (just-in-time compiler) que es un componente del CLR.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;De esta forma podriamos crearnos un lector de código MSIL, para obtener el código MSIL de los ensamblados que queramos. Es interesante ver algunos ejemplos de esto mismo en:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a title="http://blogs.msdn.com/b/haibo_luo/archive/2005/10/02/476242.aspx" href="http://blogs.msdn.com/b/haibo_luo/archive/2005/10/02/476242.aspx"&gt;http://blogs.msdn.com/b/haibo_luo/archive/2005/10/02/476242.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a title="http://www.codeproject.com/KB/cs/sdilreader.aspx" href="http://www.codeproject.com/KB/cs/sdilreader.aspx"&gt;http://www.codeproject.com/KB/cs/sdilreader.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Aquí obtenemos una buena explicación del MSIL:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a title="http://www.codeproject.com/KB/msil/ilassembly.aspx" href="http://www.codeproject.com/KB/msil/ilassembly.aspx"&gt;http://www.codeproject.com/KB/msil/ilassembly.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Llegados a este punto decir que disponemos de una maravillosa herramienta, llamada &lt;a href="http://www.red-gate.com/products/reflector/"&gt;.Net Reflector&lt;/a&gt; que va un paso más allá y nos permite obtener tanto el código MSIL de un assembly, como el código de alto nivel C#, VB, etc.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8841258910230522591?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8841258910230522591/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8841258910230522591' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8841258910230522591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8841258910230522591'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/12/reflection-y-como-ser-un-jedi-part-2.html' title='Reflection y como ser un Jedi (Part 2)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1523810833866665417</id><published>2010-10-19T06:18:00.001-07:00</published><updated>2010-10-19T08:54:09.770-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Reflection y cómo ser un Jedi (Part 1)</title><content type='html'>&lt;p&gt;&lt;strong&gt;¿Qué es reflection?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Respuesta wikipedia:&lt;/strong&gt; &lt;em&gt;&amp;quot;Reflection es el proceso por el cual un programa puede observar y modificar su propia estructura o comportamiento en tiempo de ejecución.&amp;quot; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Respuesta maestro Jedi: &lt;/strong&gt;&lt;em&gt;&amp;quot;reflection es el control de la fuerza.&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Respuesta serie Numb3rs:&lt;/strong&gt; &lt;em&gt;&amp;quot;Usamos reflection todos los días, al usar el IntelliSense, para debuggar, al usar contenedor IoC. También lo usamos para añadir webparts, para inspeccionar el código y para predecir su comportamiento. Con reflection podemos solucionar los misterios que se nos planteen.&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;¿Qué debemos hacer para empezar a utilizar la fuerza?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Existe un namespace llamado System.Reflection y una clase conocida como System.Type que nos acompañaran, en esta, fabulosa aventura hacia el interior del código.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Y así, sin más, ¿puedo empezar a usarlo?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Claro, pero no esperes aquí una clase magistral… &amp;lt;tono de Bilbao&amp;gt; ¡¡que somos desarrolladores joder!!&amp;lt;/tono de Bilbao&amp;gt;. Dame un&amp;#160; &lt;strike&gt;punto de apoyo&lt;/strike&gt;&amp;#160; HelloWorld y &lt;strike&gt;moveré el mundo&lt;/strike&gt; conoceré toda la sintaxis.&lt;/p&gt;  &lt;p&gt;Así que aquí van unas cuantos ejemplos, para la explicación vamos a utilizar una clase estúpida dentro de un namespace estúpido.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;namespace StupidNameSpace&lt;br /&gt;{&lt;br /&gt;    public class StupidClass&lt;br /&gt;    {&lt;br /&gt;        private string _field1;&lt;br /&gt;        private string _field2;&lt;br /&gt;&lt;br /&gt;        public StupidClass()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public StupidClass(string field1, string field2)&lt;br /&gt;        {&lt;br /&gt;            _field1 = field1;&lt;br /&gt;            _field2 = field2;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Field1&lt;br /&gt;        {&lt;br /&gt;            get { return _field1; }&lt;br /&gt;            set { _field1 = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Field2&lt;br /&gt;        {&lt;br /&gt;            get { return _field2; }&lt;br /&gt;            set { _field2 = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string FooMethod1()&lt;br /&gt;        {&lt;br /&gt;            return string.Empty;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string FooMethod2(string parameter)&lt;br /&gt;        {&lt;br /&gt;            return parameter;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ahora vamos a crear una pequeña aplicación de consola para interrogar, utilizando la fuerza (reflection), a nuestra clase. &lt;br /&gt;  &lt;br /&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;&lt;em&gt;Ejemplo 1:&lt;/em&gt;&lt;/font&gt;&lt;/strong&gt; &lt;br /&gt;En el primer ejemplo vamos a crear un objeto de tipo StupidClass, usando el constructor público sin parámetros y luego utilizando el constructor con parámetros.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;using System;&lt;br /&gt;using System.Reflection;&lt;br /&gt;&lt;br /&gt;namespace StupidNameSpace&lt;br /&gt;{&lt;br /&gt;    public class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            // Obtenemos el tipo, tenemos que pasadle todo el fully qualified name,&lt;br /&gt;            // tened en cuenta que estamos en el mismo namespace, y en el mismo assembly, sino fuera así,&lt;br /&gt;            // tendriamos que pasarle, el nombre del assembly.&lt;br /&gt;            var type = Type.GetType(&amp;quot;StupidNameSpace.StupidClass&amp;quot;);&lt;br /&gt;            // Podriamos haber usado:&lt;br /&gt;            // var type = typeof(StupidClass);&lt;br /&gt;&lt;br /&gt;            // Usamos el constructor sin parámetros (default constructor) para crear un objecto llamado&lt;br /&gt;            // myStupidObject&lt;br /&gt;            var types = new Type[0];&lt;br /&gt;            var constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, types, null);&lt;br /&gt;            var myStupidObject = (StupidClass)constructorInfo.Invoke(null);&lt;br /&gt;&lt;br /&gt;            // Ahora hacemos lo mismo pero llamamos al constructor que recibe 2 parámetros&lt;br /&gt;            // y creamos un objeto llamado myStupidObject2&lt;br /&gt;            types = new Type[2];&lt;br /&gt;            types[0] = typeof (string);&lt;br /&gt;            types[1] = typeof (string);&lt;br /&gt;&lt;br /&gt;            var parameters = new object[2];&lt;br /&gt;            parameters[0] = &amp;quot;param1&amp;quot;;&lt;br /&gt;            parameters[1] = &amp;quot;param2&amp;quot;;&lt;br /&gt;&lt;br /&gt;            constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, types, null);&lt;br /&gt;            var myStupidObject2 = (StupidClass) constructorInfo.Invoke(parameters);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Esto esta muy bien, pero porque sabemos que constructor tiene la clase, si es público o privado, si recibe parámetros, etc. Pero y si no lo sabemos. Pues preguntémosle.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;using System;&lt;br /&gt;using System.Reflection;&lt;br /&gt;&lt;br /&gt;namespace StupidNameSpace&lt;br /&gt;{&lt;br /&gt;    public class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            // Obtenemos el tipo, tenemos que pasadle todo el fully qualified name,&lt;br /&gt;            // tened en cuenta que estamos en el mismo namespace, y en el mismo assembly, sino fuera así,&lt;br /&gt;            // tendriamos que pasarle, el nombre del assembly.&lt;br /&gt;            var type = Type.GetType(&amp;quot;StupidNameSpace.StupidClass&amp;quot;);&lt;br /&gt;&lt;br /&gt;            ConstructorInfo[] constructors = type.GetConstructors();&lt;br /&gt;            foreach(ConstructorInfo ci in constructors)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&amp;quot;===========&amp;quot;);&lt;br /&gt;                Console.WriteLine(&amp;quot;CONSTRUCTOR&amp;quot;);&lt;br /&gt;                Console.WriteLine(&amp;quot;===========&amp;quot;);&lt;br /&gt;                Console.WriteLine(ci.Name);&lt;br /&gt;                if(ci.IsPrivate) Console.WriteLine(&amp;quot;Private&amp;quot;);&lt;br /&gt;                else Console.WriteLine(&amp;quot;Public&amp;quot;);&lt;br /&gt;                if(ci.IsStatic) Console.WriteLine(&amp;quot;Static&amp;quot;);&lt;br /&gt;                if(ci.IsAbstract) Console.WriteLine(&amp;quot;Abstract&amp;quot;);&lt;br /&gt;                if (ci.IsVirtual) Console.WriteLine(&amp;quot;Virtual&amp;quot;);&lt;br /&gt;                var parameters = ci.GetParameters();&lt;br /&gt;                if(parameters.Length &amp;gt; 0) Console.WriteLine(&amp;quot;Parameters:&amp;quot;);&lt;br /&gt;&lt;br /&gt;                foreach(ParameterInfo pi in parameters)&lt;br /&gt;                {&lt;br /&gt;                    Console.WriteLine(&amp;quot;--&amp;gt;&amp;quot; + pi.Name);&lt;br /&gt;                    Console.WriteLine(&amp;quot;--&amp;gt;&amp;quot; + pi.ParameterType);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.Read();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1523810833866665417?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1523810833866665417/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1523810833866665417' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1523810833866665417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1523810833866665417'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/10/reflection-y-como-ser-un-jedi-part-1.html' title='Reflection y cómo ser un Jedi (Part 1)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-3972404329194571864</id><published>2010-10-11T08:15:00.001-07:00</published><updated>2010-10-11T08:17:35.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Error JavaScript en LookupField Control</title><content type='html'>&lt;p&gt;Hoy he estado peleándome con uno de esos errores que odias encontrar, ya que son de esos errores que cuesta un poco reproducir, y por lo tanto su resolución no se prevé facilona. &lt;/p&gt;  &lt;p&gt;Voy a intentar situarlos en contexto:&lt;/p&gt;  &lt;p&gt;Cuando mostramos un LookupField control, por ejemplo al editar un item de una lista que uno de sus campos es un lookup hacia otra lista (editform.aspx), éste se puede mostrar de dos maneras diferentes, una cuando la lista a la que hacemos el lookup tiene menos de 20 items o 20 items y otra cuando tiene más de 20 items. En el primer caso, el control muestra un DropDownList y en el segundo muestra un textbox, un par de literales y una imagen (para no hacer que el dropdown sea demasiado largo), con ciertas llamadas a funciones javascript.&lt;/p&gt;  &lt;p&gt;Una de estas llamadas se ejecuta al hacer click en la imagen, concretamente es una llamada a la función ShowDropdown que se encuentra en el fichero core.js. Esta función acaba llamando a otras dos funciones AbsLeft y AbsTop, que son el objeto de este post.&lt;/p&gt;  &lt;p&gt;Código original de las funciones:&lt;/p&gt;  &lt;pre class="brush: js;"&gt;function AbsLeft(obj)&lt;br /&gt;{&lt;br /&gt;    var x=obj.offsetLeft;&lt;br /&gt;    var parent=obj.offsetParent;&lt;br /&gt;    while (parent.tagName !=&amp;quot;BODY&amp;quot;)&lt;br /&gt;    {&lt;br /&gt;        x+=parent.offsetLeft;&lt;br /&gt;        parent=parent.offsetParent;&lt;br /&gt;    }&lt;br /&gt;    x+=parent.offsetLeft;&lt;br /&gt;    return x;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function AbsTop(obj)&lt;br /&gt;{&lt;br /&gt;    var y=obj.offsetTop;&lt;br /&gt;    var parent=obj.offsetParent;&lt;br /&gt;    while (parent.tagName !=&amp;quot;BODY&amp;quot;)&lt;br /&gt;    {&lt;br /&gt;        y+=parent.offsetTop;&lt;br /&gt;        parent=parent.offsetParent;&lt;br /&gt;    }&lt;br /&gt;    y+=parent.offsetTop;&lt;br /&gt;    return y;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Resulta que estas dos funciones lanzan un null reference exception cuando el control lookup esta contenido dentro de un div y ese div contiene un position:relative.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Googleando un poco me he encontrado que este era un error conocido, pero la resolución que daban en un foro de sharepoint no me parecía la correcta, a saber, eliminar el position:relative.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a title="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/91f91a91-434f-444d-8a96-7823c91f862e" href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/91f91a91-434f-444d-8a96-7823c91f862e"&gt;http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/91f91a91-434f-444d-8a96-7823c91f862e&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Mi solución final ha sido sobreescribir estas funciones en la master page de mi solución:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js;"&gt;function AbsLeft(obj) {&lt;br /&gt;    var x = obj.offsetLeft;&lt;br /&gt;    var parent = obj.offsetParent;&lt;br /&gt;&lt;br /&gt;    while (parent != null &amp;amp;&amp;amp; parent.tagName != &amp;quot;DIV&amp;quot; &amp;amp;&amp;amp; parent.tagName != &amp;quot;BODY&amp;quot;) {&lt;br /&gt;        x += parent.offsetLeft;&lt;br /&gt;        parent = parent.offsetParent;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (parent != null &amp;amp;&amp;amp; parent.tagName != &amp;quot;DIV&amp;quot; &amp;amp;&amp;amp; parent != null) x += parent.offsetLeft;&lt;br /&gt;&lt;br /&gt;    return x;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function AbsTop(obj) {&lt;br /&gt;    var y = obj.offsetTop;&lt;br /&gt;    var parent = obj.offsetParent;&lt;br /&gt;&lt;br /&gt;    while (parent != null &amp;amp;&amp;amp; parent.tagName != &amp;quot;DIV&amp;quot; &amp;amp;&amp;amp; parent.tagName != &amp;quot;BODY&amp;quot;) {&lt;br /&gt;        y += parent.offsetTop;&lt;br /&gt;        parent = parent.offsetParent;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (parent != null &amp;amp;&amp;amp; parent.tagName != &amp;quot;DIV&amp;quot; &amp;amp;&amp;amp; parent != null) y += parent.offsetTop;&lt;br /&gt;&lt;br /&gt;    return y;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pero aquí no ha acabado todo, estas funciones estan dentro del core.js y el core.js tiene el atributo defer=True, por lo tanto, nunca se llamaban a las funciones que había sobreescrito. Solución: cambiar este attributo añadiendo lo siguiente en la master page.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;&amp;lt;SharePoint:ScriptLink language=&amp;quot;javascript&amp;quot; name=&amp;quot;core.js&amp;quot; Defer=&amp;quot;false&amp;quot; runat=&amp;quot;server&amp;quot;/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Para más información sobre el attribute defer, &lt;a href="http://www.w3schools.com/html5/tag_script.asp"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-3972404329194571864?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/3972404329194571864/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=3972404329194571864' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3972404329194571864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3972404329194571864'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/10/error-javascript-en-lookupfield-control.html' title='Error JavaScript en LookupField Control'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7502988041889930583</id><published>2010-10-04T08:20:00.001-07:00</published><updated>2010-10-04T08:30:32.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>Periodic table HTML 5</title><content type='html'>&lt;p&gt;Os dejo un enlace a una chuleta donde se muestran los diferentes elementos existentes en HTML 5, en forma de tabla períodica de los elementos. Cada “elemento” contiene links a W3C developer’s guide y a W3Schools.&lt;/p&gt;&lt;p&gt;&lt;a href="http://joshduck.com/periodic-table.html"&gt;http://joshduck.com/periodic-table.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7502988041889930583?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7502988041889930583/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7502988041889930583' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7502988041889930583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7502988041889930583'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/10/periodic-table-html.html' title='Periodic table HTML 5'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-6937646180874227836</id><published>2010-09-30T03:14:00.001-07:00</published><updated>2010-09-30T03:17:10.412-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>SharePoint Reference Sheet</title><content type='html'>Hay que agradecer cuando alguien hace un excelente servicio, como recoger en una misma página tantísimas propiedades muy usadas cuando trabajas con SharePoint y CAML.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://abstractspaces.wordpress.com/2008/08/01/sharepoint-reference-sheet/"&gt;http://abstractspaces.wordpress.com/2008/08/01/sharepoint-reference-sheet/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-6937646180874227836?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/6937646180874227836/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=6937646180874227836' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6937646180874227836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6937646180874227836'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/09/sharepoint-reference-sheet.html' title='SharePoint Reference Sheet'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-5802163396332639547</id><published>2010-09-27T09:02:00.001-07:00</published><updated>2010-09-27T09:02:45.447-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Truquillo CQWP</title><content type='html'>&lt;p&gt;Hoy toca un pequeño truquillo que va bien para mostrar los campos que le estan llegando a una Content Query Web Part, así como el valor de estos campos.&lt;/p&gt;  &lt;p&gt;La ideas es my simple, modificar el itemstyle.xsl o crear uno custom y añadir el siguiente trozo de xsl:&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;xsl:for-each select=&amp;quot;@*&amp;quot;&amp;gt;&lt;br /&gt;    Name:&amp;lt;xsl:value-of select=&amp;quot;name()&amp;quot; /&amp;gt;&lt;br /&gt;    Value:&amp;lt;xsl:value-of select&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/xsl:for-each&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Una explicación más detallada la podemos encontrar &lt;a href="http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-5802163396332639547?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/5802163396332639547/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=5802163396332639547' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5802163396332639547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5802163396332639547'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/09/truquillo-cqwp.html' title='Truquillo CQWP'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-4171150888802386647</id><published>2010-09-21T06:56:00.001-07:00</published><updated>2010-09-21T06:58:33.012-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Crear una managed metadata column</title><content type='html'>&lt;p&gt;Crear una managed metadata column no es tan fácil como seria crear una columna de tipo texto o numérica, etc. El proceso se parece más bien a la manera de crear una columna de tipo lookup.&lt;/p&gt;  &lt;p&gt;Este sería el tag Field para una managed metadata column:&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;Field Type=&amp;quot;TaxonomyFieldTypeMulti&amp;quot;&lt;br /&gt;        DisplayName=&amp;quot;MyName&amp;quot;&lt;br /&gt;        List=&amp;quot;TaxonomyHiddenList&amp;quot;&lt;br /&gt;        WebId=&amp;quot;/&amp;quot;&lt;br /&gt;        ShowField=&amp;quot;Term1033&amp;quot;&lt;br /&gt;        Required=&amp;quot;FALSE&amp;quot;&lt;br /&gt;        EnforceUniqueValues=&amp;quot;FALSE&amp;quot;&lt;br /&gt;        Mult=&amp;quot;TRUE&amp;quot;&lt;br /&gt;    Sorteable=&amp;quot;FALSE&amp;quot;&lt;br /&gt;        ID=&amp;quot;{71A679B9-B7A4-474D-B2EF-D5230C3285AD}&amp;quot;&lt;br /&gt;        StaticName=&amp;quot;MyName&amp;quot;&lt;br /&gt;        Name=&amp;quot;MyName&amp;quot;&lt;br /&gt;        Group=&amp;quot;MyColumns&amp;quot;&lt;br /&gt;        Indexed=&amp;quot;FALSE&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;Default /&amp;gt;&lt;br /&gt;  &amp;lt;Customization&amp;gt;&lt;br /&gt;    &amp;lt;ArrayOfProperty&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;SspId&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q1=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q1:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;GroupId&amp;lt;/Name&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;TermSetId&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q2=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q2:string&amp;quot; xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;MyTermSetId&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;AnchorId&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q3=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q3:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;UserCreated&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q4=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q4:boolean&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;false&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;Open&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q5=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q5:boolean&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;false&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;TextField&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q6=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q6:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;{AD2D9982-10C9-4BDA-A04C-754EC1DCA9FA}&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;IsPathRendered&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q7=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q7:boolean&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;false&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;IsKeyword&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q8=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q8:boolean&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;false&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;TargetTemplate&amp;lt;/Name&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;CreateValuesInEditForm&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q9=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q9:boolean&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;false&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;FilterAssemblyStrongName&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q10=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q10:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;FilterClassName&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q11=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q11:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;Microsoft.SharePoint.Taxonomy.TaxonomyField&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;FilterMethodName&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q12=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q12:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;GetFilteringHtml&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;      &amp;lt;Property&amp;gt;&lt;br /&gt;        &amp;lt;Name&amp;gt;FilterJavascriptProperty&amp;lt;/Name&amp;gt;&lt;br /&gt;        &amp;lt;Value     xmlns:q13=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;            p4:type=&amp;quot;q13:string&amp;quot;&lt;br /&gt;            xmlns:p4=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;FilteringJavascript&amp;lt;/Value&amp;gt;&lt;br /&gt;      &amp;lt;/Property&amp;gt;&lt;br /&gt;    &amp;lt;/ArrayOfProperty&amp;gt;&lt;br /&gt;  &amp;lt;/Customization&amp;gt;&lt;br /&gt;&amp;lt;/Field&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Además hay que tener en cuenta que al crear una managed metadata column en una lista, también se añade una columna de tipo Note, asociada a esta. Aquí mostramos un ejemplo.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;&amp;lt;Field Type=&amp;quot;Note&amp;quot;&lt;br /&gt;         DisplayName=&amp;quot;MyName_0&amp;quot;&lt;br /&gt;         StaticName=&amp;quot;MyNameTaxHTField0&amp;quot;&lt;br /&gt;         Name=&amp;quot;MyNameTaxHTField0&amp;quot;&lt;br /&gt;         ID=&amp;quot;{AD2D9982-10C9-4BDA-A04C-754EC1DCA9FA}&amp;quot;&lt;br /&gt;         ShowInViewForms=&amp;quot;FALSE&amp;quot;&lt;br /&gt;         Required=&amp;quot;FALSE&amp;quot;&lt;br /&gt;         Hidden=&amp;quot;TRUE&amp;quot;&lt;br /&gt;         CanToggleHidden=&amp;quot;TRUE&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como podéis ver en el primer xml (reference al field de la managed metadata column) hay un conjunto de atributos o elementos que no los podemos saber cuando creamos el xml, sino que lo sabremos en tiempo de ejecución o de provisioning.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Estos elementos serían los siguientes:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;WebId&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;List&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;SspId&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;TermSetId&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;AnchorId&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;*TextField (esto lo podemos saber si nosotros previamente hemos provisionado el field note que irá asociado a esta columna)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Esto lo hemos solucionando, con un feature receiver que introduce estos atributos (o elementos) en el xml, durante la ejecución, a continuación se muestra algún trozo de esta solución.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Los pasos a seguir serían los siguientes:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;// Add Note Field&lt;br /&gt;&lt;br /&gt;string fileManagedMetadataNoteField = @&amp;quot;C:\NoteField.xml&amp;quot;;&lt;br /&gt;&lt;br /&gt;var xmlDocNoteField = XDocument.Load(fileManagedMetadataNoteField);&lt;br /&gt;&lt;br /&gt;web.Site.RootWeb.Fields.AddFieldAsXml(xmlDocNoteField);&lt;br /&gt;&lt;br /&gt;// Get Managed Metadata Column xml&lt;br /&gt;string filePath = @&amp;quot;C:\ManagedMetadataColumn.xml&amp;quot;;&lt;br /&gt;&lt;br /&gt;var xmlDoc = XDocument.Load(filePath);&lt;br /&gt;&lt;br /&gt;// Modify WebId and ListId&lt;br /&gt;ReplaceWebIdAndListId(xmlDoc, web);&lt;br /&gt;                      &lt;br /&gt;// Modify Customization Element &lt;br /&gt;ModifyCustomization(web, xmlDoc);&lt;br /&gt;&lt;br /&gt;web.Site.RootWeb.Fields.AddFieldAsXml(xmlDoc);&lt;br /&gt;&lt;br /&gt;private void ReplaceWebIdAndListId(XDocument doc, SPWeb web)&lt;br /&gt;        {&lt;br /&gt;            var attributeWebId = from f in doc.Elements(&amp;quot;Field&amp;quot;)&lt;br /&gt;                                 select f.Attribute(&amp;quot;WebId&amp;quot;);&lt;br /&gt;&lt;br /&gt;            var attributeList = from f in doc.Elements(&amp;quot;Field&amp;quot;)&lt;br /&gt;                                select f.Attribute(&amp;quot;List&amp;quot;);&lt;br /&gt;&lt;br /&gt;            string webUrl = attributeWebId.First().Value;&lt;br /&gt;&lt;br /&gt;            string listName = attributeList.First().Value;&lt;br /&gt;&lt;br /&gt;            SPWeb referencedWeb = web;&lt;br /&gt;            if (!string.IsNullOrEmpty(webUrl))&lt;br /&gt;            {&lt;br /&gt;                referencedWeb = web.Site.OpenWeb(webUrl);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            attributeWebId.First().SetValue(referencedWeb.ID.ToString());&lt;br /&gt;&lt;br /&gt;            SPList referencedList = referencedWeb.Lists[listName];&lt;br /&gt;&lt;br /&gt;            attributeList.First().SetValue(referencedList.ID.ToString(&amp;quot;B&amp;quot;));&lt;br /&gt;&lt;br /&gt;            if (!string.IsNullOrEmpty(webUrl))&lt;br /&gt;            {&lt;br /&gt;                referencedWeb.Dispose();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private void ModifyCustomization(SPWeb web, XDocument doc)&lt;br /&gt;        {&lt;br /&gt;            var properties = from p in doc.Descendants(&amp;quot;Property&amp;quot;)&lt;br /&gt;                             select p;&lt;br /&gt;&lt;br /&gt;            TermStore termStore = null;&lt;br /&gt;            TermSet termSet = null;&lt;br /&gt;&lt;br /&gt;            foreach (var property in properties)&lt;br /&gt;            {&lt;br /&gt;                switch (property.Element(&amp;quot;Name&amp;quot;).Value)&lt;br /&gt;                {&lt;br /&gt;                    case &amp;quot;SspId&amp;quot;:&lt;br /&gt;                        termStore = GetDefaultSiteCollectionTermStore(web.Site);&lt;br /&gt;                        property.Element(&amp;quot;Value&amp;quot;).SetValue(termStore.Id.ToString());&lt;br /&gt;                        break;&lt;br /&gt;                    case &amp;quot;TermSetId&amp;quot;:&lt;br /&gt;                        termSet = GetTermSet(termStore, property.Element(&amp;quot;Value&amp;quot;).Value);&lt;br /&gt;                        property.Element(&amp;quot;Value&amp;quot;).SetValue(termSet.Id.ToString());&lt;br /&gt;                        break;&lt;br /&gt;                    case &amp;quot;AnchorId&amp;quot;:&lt;br /&gt;                        Guid termId = GetTermId(termSet, property.Element(&amp;quot;Value&amp;quot;).Value);&lt;br /&gt;                        property.Element(&amp;quot;Value&amp;quot;).SetValue(termId.ToString());&lt;br /&gt;                        break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private TermStore GetDefaultSiteCollectionTermStore(SPSite site)&lt;br /&gt;        {&lt;br /&gt;            TaxonomySession session = new TaxonomySession(site);&lt;br /&gt;            return session.DefaultSiteCollectionTermStore;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private TermSet GetTermSet(TermStore termStore, String termSetName)&lt;br /&gt;        {&lt;br /&gt;            TermSetCollection termSets = termStore.GetTermSets(termSetName, termStore.WorkingLanguage);&lt;br /&gt;            return termSets[0];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private Guid GetTermId(TermSet termSet, String termNames)&lt;br /&gt;        {&lt;br /&gt;            TermCollection termCollection = termSet.Terms;&lt;br /&gt;            Term term = null;&lt;br /&gt;&lt;br /&gt;            if (!string.IsNullOrEmpty(termNames))&lt;br /&gt;            {&lt;br /&gt;                termNames.Split('/').ToList().ForEach(delegate(String termName)&lt;br /&gt;                {&lt;br /&gt;                    term = termCollection[termName];&lt;br /&gt;                    termCollection = term.Terms;&lt;br /&gt;                });&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (term == null) return Guid.Empty;&lt;br /&gt;            else return term.Id;&lt;br /&gt;        }&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-4171150888802386647?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/4171150888802386647/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=4171150888802386647' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/4171150888802386647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/4171150888802386647'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/09/crear-una-managed-metadata-column.html' title='Crear una managed metadata column'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-6386412145919429221</id><published>2010-09-21T06:14:00.001-07:00</published><updated>2010-09-21T06:17:21.813-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Add managed metadata programmatically II</title><content type='html'>&lt;p&gt;En el post anterior comentaba el nuevo servicio de managed metadata introducido en MSS 2010, además se explicaba como añadir los términos utilizando la interfaz gráfica. En este nuevo post se va a hacer incapie de como añadir estos metadatos a través del modelo de objetos de MSS 2010.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;TaxonomySession session = new TaxonomySession(site);&lt;br /&gt;TermStore termStore = session.DefaultSiteCollectionTermStore;&lt;br /&gt;ImportManager im = termStore.GetImportManager();&lt;br /&gt;&lt;br /&gt;var groupToAddTermSet = termStore.CreateGroup(&amp;quot;Group name&amp;quot;);&lt;br /&gt;groupToAddTermSet.Description = &amp;quot;Group description&amp;quot;;&lt;br /&gt;&lt;br /&gt;bool allTermsAdded = false;&lt;br /&gt;string errorMessage = string.Empty;&lt;br /&gt;&lt;br /&gt;using (TextReader streamReader = new StreamReader(csvPath))&lt;br /&gt;{&lt;br /&gt;    im.ImportTermSet(groupToAddTermSet, streamReader, out allTermsAdded, out errorMessage);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;termStore.CommitAll();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Cómo podemos ver en este code snippet, le estamos pasando un TextReader a la función de ImportTermSet del objecto de tipo ImportManager. Este TextReader es un stream a un fichero .csv, con el siguiente formato:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;quot;Term Set Name&amp;quot;,&amp;quot;Term Set Description&amp;quot;,&amp;quot;LCID&amp;quot;,&amp;quot;Available for Tagging&amp;quot;,&amp;quot;Term Description&amp;quot;,&amp;quot;Level 1 Term&amp;quot;,&amp;quot;Level 2 Term&amp;quot;,&amp;quot;Level 3 Term&amp;quot;,&amp;quot;Level 4 Term&amp;quot;,&amp;quot;Level 5 Term&amp;quot;,&amp;quot;Level 6 Term&amp;quot;,&amp;quot;Level 7 Term&amp;quot;&lt;br /&gt;  &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-6386412145919429221?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/6386412145919429221/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=6386412145919429221' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6386412145919429221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6386412145919429221'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/09/add-managed-metadata-programmatically.html' title='Add managed metadata programmatically II'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1690838893615787251</id><published>2010-09-21T06:05:00.001-07:00</published><updated>2010-09-21T06:06:45.908-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><title type='text'>Add managed metadata programmatically I</title><content type='html'>&lt;p&gt;Con MSS 2010 disponemos de un nuevo servicio llamado Managed Metadata Service, con este servicio podemos tener conjuntos de términos, términos y subtérminos que pueden ser utilizados en nuestros sitios como metadatos para nuestros items, de esta forma podemos “etiquetar” de una manera elegante nuestro contenido.&lt;/p&gt;  &lt;p&gt;Además, MSS 2010, dispone de un conjunto de utilidades, para navegar por estas managed metadatas.&lt;/p&gt;  &lt;p&gt;En este post, se intentará explicar como proveer estos metadatos de forma programatically.&lt;/p&gt;  &lt;p&gt;Para más información sobre este servicio podéis consultar la siguiente url:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ee424402.aspx"&gt;http://technet.microsoft.com/en-us/library/ee424402.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un compañero de spenta, Ignasi Tebé, en su blog también comenta esta nueva funcionalidad de manera detallada:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sharepointer.es/2010/02/mss-2010-servicio-de-metadatos.html"&gt;MSS 2010: Servicio de Metadatos Administrados (I)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.sharepointer.es/2010/02/mss-2010-servicio-de-metadatos_10.html"&gt;MSS 2010: Servicio de Metadatos Administrados (II) Content Type Hubs&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.sharepointer.es/2010/02/mss-2010-servicio-de-metadatos_11.html"&gt;MSS 2010: Servicio de Metadatos Administrados (III) Ejemplo de uso&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.sharepointer.es/2010/05/mss-2010-metadatos-administrados.html"&gt;MSS 2010: Metadatos administrados: Terminos anidados.&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.sharepointer.es/2010/05/mss-2010-metadatos-administrados_06.html"&gt;MSS 2010: Metadatos administrados: Importación de estructuras.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo que voy a explicar, también se puede hacer directamente a través de la interfaz gráfica de la administración central, a continuación voy a explicar los pasos a seguir para hacerlo a través de la administración central.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ir a Central Administration&lt;/li&gt;    &lt;li&gt;Manage Service Applications&lt;/li&gt;    &lt;li&gt;Managed Metadata Services&lt;/li&gt;    &lt;li&gt;Add term group&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Add term set&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Add term&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Add sub term&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1690838893615787251?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1690838893615787251/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1690838893615787251' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1690838893615787251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1690838893615787251'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/09/add-managed-metadata-programmatically-i.html' title='Add managed metadata programmatically I'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-2025821169082785510</id><published>2010-07-28T03:14:00.001-07:00</published><updated>2010-07-28T03:20:59.256-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio 2010'/><title type='text'>FileNotFoundException al crear un objeto SPSite en Visual Studio 2010</title><content type='html'>Hoy me he encontrado con un problema tonto, pero que me ha hecho perder un ratillo de trabajo, y es el siguiente:&lt;br /&gt;&lt;br /&gt;He creado una aplicación de consola con Visual Studio 2010 y me he propuesto hacer un simple SPSite site = new SPSite("http://localhost");, me he quedado estupefacto cuando esta instrucción me ha lanzado una excepción del tipo FileNotFoundException. Al principio he pensado que era algo de temas de permisos y tal y he empezado a mirar detalladamente, pero nada todo parecía estar correcto.&lt;br /&gt;&lt;br /&gt;Googleando he visto el siguiente hilo: &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopmentprerelease/thread/ae57f9f1-7a6c-48bc-95ac-2643b76867d8"&gt;http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopmentprerelease/thread/ae57f9f1-7a6c-48bc-95ac-2643b76867d8&lt;/a&gt; y efectivamente, !!esto es lo que me pasaba a mi!!&lt;br /&gt;&lt;br /&gt;Mi entorno es un entorno de 64bits donde tengo instalado mi granja de MSS 2010. Parece ser que cuando creas un proyecto de console application en visual studio 2010, queda configurado x86 como platform target, simplemente cambiando esto a x64 o Any CPU, funciona correctamente.&lt;br /&gt;&lt;br /&gt;Para cambiarlo, hemos de acceder a las propiedades del proyecto y en la pestaña Build cambiar el dropdown de platform target.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-2025821169082785510?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/2025821169082785510/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=2025821169082785510' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2025821169082785510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2025821169082785510'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/07/filenotfoundexception-al-crear-un.html' title='FileNotFoundException al crear un objeto SPSite en Visual Studio 2010'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-5915932495834182855</id><published>2010-07-27T02:28:00.000-07:00</published><updated>2010-09-21T02:20:59.508-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><title type='text'>Add managed properties programmatically</title><content type='html'>Siguiendo con el tema de búsqueda en MSS 2010, nos podemos encontrar que deseamos crear managed properties en tiempo de despliegue, por lo que necesitariamos de alguna forma poder crear managed properties dentro de un feature receiver por ejemplo. Antes de proceder comentar que si bien esto es posible, primero necesitariamos contar con crawled properties ya generadas (por ejemplo de nuestros metadatos), y para ello primero necesitariamos una primera indexación. Una vez comentado esto procederemos a explicar como provisionar estas managed properties.&lt;br /&gt;&lt;br /&gt;Lo primero que deberiamos hacer es obtener el searchserviceapplication, para que a partir de este podamos obtener el schema. Esto lo vimos en el post &lt;a href="http://jordiruiznet.blogspot.com/2010/07/crear-exclude-crawling-rules.html"&gt;anterior&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;SPServiceContext serviceContext = SPServiceContext.GetContext(site);&lt;br /&gt;                   &lt;br /&gt;                    SPServiceApplicationProxy proxy = serviceContext.GetDefaultProxy(typeof(SearchServiceApplicationProxy));&lt;br /&gt;                    SearchServiceApplicationProxy searchAppProxy = proxy as SearchServiceApplicationProxy;&lt;br /&gt;&lt;br /&gt;                    SearchServiceApplicationInfo ssai = searchAppProxy.GetSearchServiceApplicationInfo();&lt;br /&gt;                    SearchServiceApplication application =&lt;br /&gt;                      Microsoft.Office.Server.Search.Administration.SearchService.Service.SearchApplications.&lt;br /&gt;                      GetValue&lt;searchserviceapplication&gt;(ssai.SearchServiceApplicationId);&lt;br /&gt;&lt;br /&gt;                    Schema schema = new Schema(application);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Una vez tenemos esto podemos proceder a crear la managed property, una managed property consta principalmente de un nombre, un tipo de dato (text, integer, datetime), y un mapping con una o más crawled properties.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;MappingCollection mappingCollection = new MappingCollection();&lt;br /&gt;&lt;br /&gt;                            Microsoft.Office.Server.Search.Administration.ManagedProperty managedProperty = schema.AllManagedProperties.Create("My Managed Property", ManagedDataType.Text);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                            CrawledProperty crawledProperty = GetCrawledProperty(schema, "MyCrawledProperty", ManagedDataType.Text);&lt;br /&gt;                            Mapping mapping = new Mapping(crawledProperty.Propset, crawledProperty.Name, crawledProperty.VariantType, managedProperty.PID);&lt;br /&gt;&lt;br /&gt;                            mappingCollection.Add(mapping);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                            managedProperty.SetMappings(mappingCollection);&lt;br /&gt;&lt;br /&gt;                            managedProperty.Update();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En este trozo de código podemos ver que hacemos una llamada a un método que nos devuelve una crawled property a partir del schema, un tipo y un nombre. A continuación muestro este método que se encarga de recorrer las crawled properties para obtener la que hemos solicitado.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;protected CrawledProperty GetCrawledProperty(Schema schema, string name, ManagedDataType type)&lt;br /&gt;        {&lt;br /&gt;            CrawledProperty result = null;&lt;br /&gt;&lt;br /&gt;            foreach (CrawledProperty cproperty in schema.QueryCrawledProperties(string.Empty, 1000, Guid.NewGuid(), string.Empty, true))&lt;br /&gt;            {&lt;br /&gt;                if (cproperty.Name == name)&lt;br /&gt;                {&lt;br /&gt;                    if (cproperty.VariantType == GetVariantType(type))&lt;br /&gt;                    {&lt;br /&gt;                        result = cproperty;&lt;br /&gt;                        break;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected int GetVariantType(ManagedDataType type)&lt;br /&gt;        {&lt;br /&gt;            switch (type)&lt;br /&gt;            {&lt;br /&gt;                case ManagedDataType.Text: return 31;&lt;br /&gt;                case ManagedDataType.Decimal: return 5;&lt;br /&gt;                case ManagedDataType.Integer: return 20;&lt;br /&gt;                case ManagedDataType.DateTime: return 64;&lt;br /&gt;                default: return 31;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bueno, pues esto es todo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-5915932495834182855?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/5915932495834182855/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=5915932495834182855' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5915932495834182855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5915932495834182855'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/07/add-managed-properties-programmatically.html' title='Add managed properties programmatically'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1419185047493132875</id><published>2010-07-26T04:47:00.001-07:00</published><updated>2010-09-21T02:22:20.511-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><title type='text'>Crear exclude crawling rules programmatically 2010</title><content type='html'>Hace unos días comentaba como &lt;a href="http://jordiruiznet.blogspot.com/2010/04/crear-exclude-crawling-rules.html"&gt;crear exclude crawling rules en Microsoft Office SharePoint Server 2007&lt;/a&gt; , hoy haremos lo mismo pero ahora con Microsoft SharePoint Server 2010.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Obtener el Search Context a partir del SPSite&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;SPServiceContext serviceContext = SPServiceContext.GetContext(site);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Obtenemos el proxy del application service de search (esto es nuevo en 2010, como sabemos ahora desaparecido el shared service provider y tenemos una nueva arquitectura de servicios de aplicación)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;SPServiceApplicationProxy proxy = serviceContext.GetDefaultProxy(typeof(SearchServiceApplicationProxy));&lt;br /&gt;                    SearchServiceApplicationProxy searchAppProxy = proxy as SearchServiceApplicationProxy;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Obtenemos el objecto de la aplicación de search&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;SearchServiceApplicationInfo ssai = searchAppProxy.GetSearchServiceApplicationInfo();&lt;br /&gt;                    SearchServiceApplication application =&lt;br /&gt;                      Microsoft.Office.Server.Search.Administration.SearchService.Service.SearchApplications.&lt;br /&gt;                      GetValue&lt;SearchServiceApplication&gt;(ssai.SearchServiceApplicationId);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. Obtenemos el Content Source a partir del objecto SerchApplication&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;Content content = new Content(application);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A partir de aquí es bastante parecido a como trabajabamos con MOSS 2007.&lt;br /&gt;&lt;br /&gt;5. Añadir la crawl rule a la colección de crawlrules del content source&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharp" name="code"&gt;&lt;br /&gt;CrawlRule crawlRule = content.CrawlRules.Create(CrawlRuleType.ExclusionRule, "http://*/forms/*");&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6. Añadir propiedades&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;crawlRule.FollowComplexUrls = true;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;7. Commit la regla en la base de datos&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;crawlRule.Update();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1419185047493132875?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1419185047493132875/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1419185047493132875' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1419185047493132875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1419185047493132875'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/07/crear-exclude-crawling-rules.html' title='Crear exclude crawling rules programmatically 2010'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-57093007750039171</id><published>2010-07-13T04:10:00.000-07:00</published><updated>2010-07-13T04:42:42.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><title type='text'>Instalar sharepoint 2010 con un usuario local sí, pero no</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Hace unos días comentaba que nos podiamos saltar la restricción que imponian desde Microsoft en cuanto a la instalación de un MSS 2010 (Microsoft SharePoint Server 2010) y creación de una granja bajo una cuenta de administrador local. Hoy he de decir que si que es posible, pero nos encontraremos problemas respecto al servicio de búsqueda. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Al intentar configurar el servicio de búsqueda e intentar realizar alguna búsqueda me encontraba con un error del tipo: "Internal server error exception".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://1.bp.blogspot.com/_Pr5OkOx_Vdo/TDxLAwljpRI/AAAAAAAAAEc/CcuASH9oPw0/s400/errormss.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 180px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5493348121899672850" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estirando del hilo, surfeando por logs e intentado descrifrar el porqué y cuando se producía este error llegue a ver otro error del tipo: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;EnumerateQueryComponents returned an error after enumerating 0 components. Error returned was 0x80131600.&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cd74d139-25c5-4db5-8c81-a9b9a6e17b1f&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;07/13/2010 12:39:51.68 &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;w3wp.exe (0x14D0)                       &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;0x151C&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;SharePoint Server Search      &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Query Processor               &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;e2tq&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;High    &lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;   Source: Microsoft.Office.Server.Search   Description: No query components were found for this search application.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces dije, bueno pues voy a crear añadir un query component siguiendo los pasos que se indican &lt;a href="http://technet.microsoft.com/en-us/library/ee805953.aspx"&gt;aquí&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Al intentar finalizar el último paso me encontré de nuevo con otra barrera. Y con el siguiente error:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Component cbfb21b3-805b-4e3e-9c37-8339756385f9-query-0 of search application 'Search Service Application' has failed to execute transition sequence 'initialize with empty catalog' due to the following error: System.ArgumentException: The SDDL string contains an invalid sid or a sid that cannot be translated.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por último googleando un poco más y buscando el error que me había dado encontre algunos post que hacian referencia a que no es compatible el servicio de búsqueda y una granja configurada con un usuario local.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://social.technet.microsoft.com/Forums/en-US/sharepoint2010setup/thread/58902475-396e-42ef-b19d-b06bd4df1ad0"&gt;http://social.technet.microsoft.com/Forums/en-US/sharepoint2010setup/thread/58902475-396e-42ef-b19d-b06bd4df1ad0&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tristanwatkins.com/?p=885"&gt;http://tristanwatkins.com/?p=885&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-57093007750039171?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/57093007750039171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=57093007750039171' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/57093007750039171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/57093007750039171'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/07/instalar-sharepoint-2010-con-un-usuario_13.html' title='Instalar sharepoint 2010 con un usuario local sí, pero no'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pr5OkOx_Vdo/TDxLAwljpRI/AAAAAAAAAEc/CcuASH9oPw0/s72-c/errormss.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8804394065479409392</id><published>2010-07-08T01:05:00.000-07:00</published><updated>2010-07-08T01:07:41.872-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Ordenar listas en MOSS 2007</title><content type='html'>Si alguna vez nos hemos fijado en una lista de links, esta incorpora una action que nos permite ordenarla. Esta action lo que nos hace es llevarnos a una application page llamada reorder.aspx.&lt;br /&gt;&lt;br /&gt;Luego puedes utilizar el campo order para ordenar los items en una content query webpart por ejemplo.&lt;br /&gt;&lt;br /&gt;Tirando un poco más del hilo observas que toda item de cualquier lista, contiene ese campo order.&lt;br /&gt;&lt;br /&gt;Y aquí es donde surge la pregunta: ¿por qué los señores de Redmond no han incorporado esto a todas las listas y así poder usar esta ordenación en las content query webparts?&lt;br /&gt;&lt;br /&gt;Pensando que ha sido un despite, nos decidimos a incorporar esta funcionalidad a todas las listas creando una custom action y añadiendola a todas las listas. Pero cuál fue nuestro despiste que vimos que esta ordenación funcionaba bien excepto para las document libraries.&lt;br /&gt;&lt;br /&gt;Haciendo un poquito de debugging y reflectoring vimos que el problema reside en el método que usa para ordenar las listas, este método es un método de la clase SPListItemCollection, el método se llama &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitemcollection.reorderitems.aspx"&gt;ReorderItems&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ahora ya habiamos cruzado ese umbral que es más facil seguir para adelante que volverse para atrás así que nos decidimos a rehacer ese algoritmo de ordenación para que funcionase también con las document libraries.&lt;br /&gt;&lt;br /&gt;En definitiva los artefactos que hemos creado han sido:&lt;br /&gt;&lt;br /&gt;- Una custom action que se añade a todas las listas y su correspondiente feature&lt;br /&gt;- Un page adapter para capturar el submit de la página reorder.aspx y a partir de aquí llamar a nuestro nuevo algoritmo de reordenación.&lt;br /&gt;- Un extensión method para SPListItemCollection que implementa el algoritmo de ordenación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8804394065479409392?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8804394065479409392/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8804394065479409392' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8804394065479409392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8804394065479409392'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/07/ordenar-listas-en-moss-2007.html' title='Ordenar listas en MOSS 2007'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7876416173053024893</id><published>2010-07-06T06:47:00.000-07:00</published><updated>2010-07-13T04:22:55.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MSS 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Instalar sharepoint 2010 con un usuario local</title><content type='html'>Por defecto, el wizard de sharepoint 2010 no nos permite crear una granja a partir de una cuenta de usuario local, pero nos podemos saltar esta protección gracias a un comando de powershell, en concreto: New-SPConfigurationDatabase. Una vez creamos la base de datos de configuración a partir de este comando, podemos arrancar de nuevo el wizard de instalación y ya nos reconocera una base de datos de configuración que habrá sido creada y configurada con nuestro usuario local.&lt;br /&gt;&lt;br /&gt;Para más info:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dev4side.com/community/blog/2010/5/2/how-to-install-sharepoint-2010-with-a-local-account.aspx"&gt;http://www.dev4side.com/community/blog/2010/5/2/how-to-install-sharepoint-2010-with-a-local-account.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7876416173053024893?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7876416173053024893/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7876416173053024893' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7876416173053024893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7876416173053024893'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/07/instalar-sharepoint-2010-con-un-usuario.html' title='Instalar sharepoint 2010 con un usuario local'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-3748723663769061466</id><published>2010-06-30T11:04:00.000-07:00</published><updated>2010-06-30T12:44:16.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones'/><title type='text'>¿Hasta cuándo el divide y vencerás?</title><content type='html'>En los inicios el aprendizaje se aglutinaba en una sola materia, a saber, &lt;span style="font-style:italic;"&gt;LA FILOSOFÍA, &lt;/span&gt;&lt;span&gt;aunque ya Aristóteles en su libro &lt;i&gt;FÍSICA&lt;/i&gt;, dividía entre matemáticas, física, filosofía primera, etc.&lt;/span&gt;&lt;div&gt;Pero esta división hay ido aumentando con el paso de los años y han aparecido muchísimas materias, entre ellas, historia, geografía, matemáticas, física, química, religión, medicina, etc., y ojo que estoy enumerando las materias troncales, porque de éstas además aparecen otras como, ingeniería de puertos y caminos, ingeniería informática, ingeniería industrial, estadística, y un sinfín que no me voy a poner ahora a enumerar. Si además cogemos una de estas materias vemos que aparecen dentro de ellas innumerables especializaciones, y el lector en este punto se preguntará que a dónde quiero llegar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Antes de que el lector se desoriente del todo y abandone este blog voy a explicarle, el porqué de esta entrada. Llevo un tiempo fijándome en que la gente se suele especializar en una rama de una materia concreta haciéndose poseedor de un gran conocimiento sobre su especialización, un sabio, se podría decir, y esto no es malo, pero puede llegar a un punto que antepone su conocimiento al resto de los conocimientos, y de alguna forma puede llegar a ningunear los "otros conocimientos". Para intentar clarificar mi posición voy a poner un ejemplo, hoy he estado leyendo un blog sobre una persona experta en usabilidad y arquitectura de la información, en uno de sus posts había escrito que "lo más importante" son las interfaces y el autor podría enumerar muchos argumentos donde le tendríamos que dar la razón de manera inexorable. Pero da la casualidad que si hablas con un administrador de bases de datos, te dirá que "lo más importante" son los datos y de nuevo nos bombardeará con n argumentos, todos dignos de aprobación, y es increíble que si hablásemos con un experto en cualquier otra rama podría ofrecernos un abanico de argumentos exponiéndonos que su rama es "lo más importante". Y aquí es donde empieza a perder la credibilidad el primero, el segundo y el resto de expertos. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Personalmente, creo que nada es "lo más importante" sino que cada cosa es importante en su medida, y lo realmente importante es el todo y el todo visto como una composición de las partes, y digo composición y no agregación, porque no creo que ese todo pueda sobrevivir a una de sus partes. En el campo del desarrollo (que es donde mejor me muevo, debido a mi "especialización"), no puede existir una gran aplicación donde la interfaz sea muy buena, pero por ejemplo la aplicación no sea mantenible, o no puede existir una gran aplicación donde tenga una estructura de datos inmejorable, pero la interfaz sea bochornosa, y así con cada una de sus partes. Dejemos de "dividir" y empecemos a "componer". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero bueno en realidad no estoy diciendo nada nuevo, yo creo que esto es sabido por todos, pero no soporto cuando leo a expertos que a propósito o inducidos por su súper yo piensan que su rama o especialización se puede sobreponer a cualquier otra, para mi esto es el claro ejemplo de la definición de &lt;i&gt;hombre masa&lt;/i&gt; expuesta por Ortega y Gasset. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;"He aquí un precioso ejemplar de este extraño hombre nuevo que he intentado, por una y otra de sus vertientes y haces, definir. He dicho que era una configuración humana sin par en toda la historia. El especialista nos sirve para concretar enérgicamente la especie y hacernos ver todo el radicalismo de su novedad. Porque antes los hombres podían dividirse, sencillamente, en sabios e ignorantes, en más o menos sabios y más o menos ignorantes. Pero el especialista no puede ser subsumido bajo ninguna de esas dos categorías. No es sabio, porque ignora formalmente cuanto no entra en su especialidad; pero tampoco es un ignorante, porque es «un hombre de ciencia» y conoce muy bien su porciúncula de universo. Habremos de decir que es un sabio-ignorante, cosa sobremanera grave, pues significa que es un señor el cual se comportará en todas las cuestiones que ignora no como un ignorante, sino con toda la petulancia de quien en su cuestión especial es un sabio." &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;J&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;osé Ortega y Gasset&lt;/span&gt;.&lt;/b&gt; La rebelión de las masas.&lt;/div&gt;  &lt;!--EndFragment--&gt;   &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-3748723663769061466?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/3748723663769061466/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=3748723663769061466' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3748723663769061466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3748723663769061466'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/06/hasta-cuando-el-divide-y-venceras.html' title='¿Hasta cuándo el divide y vencerás?'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8963401326226963433</id><published>2010-06-15T07:50:00.001-07:00</published><updated>2010-06-15T07:58:18.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>SharePoint css y error javascript al mover webparts</title><content type='html'>&lt;p&gt;Hoy me he encontrado con un problemilla al intentar mover (drag and drop) unas webparts de una webpart zone a otra, el problema era bien simple, me ha saltado un error javascript y no me dejaba hacer esta operación.&lt;/p&gt;  &lt;p&gt;He debugado el javascript que me estaba dando problemas y resulta que era una función llamada MSOLayout_GetRealOffset. Esta función se encuentra en el fichero&amp;#160; \TEMPLATE\LAYOUTS\1033\IE55UP.JS.&lt;/p&gt;  &lt;p&gt;Googleando un poco me he encontrado que este problema aparece cuando tu master page contiene algún referencia a estilo con position:relative. Y este era mi caso. Puedes observarlo &lt;a href="http://vspug.com/tmt/2007/11/01/CSS-causes-JavaScript-error-while-moving-Web-Parts-in-edit-mode/"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Googleando también he econtrado una solución a este problema &lt;a href="http://neilmosafi.blogspot.com/2007/11/sharepoint-dragging-webparts-causes.html"&gt;aquí&lt;/a&gt;. Ésta básicamente reside o bien en quitar el position:relative del css (cosa que no me ha interesado) o bien sobreescribir esta función. Por lo que he optado por esta segunda. Para sobreescribir esta función simplemente has de copiar el siguiente código después del SPWebPartManager. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre class="javascript" name="code"&gt;&lt;script language="javascript" type="text/javascript"&gt;            function MSOLayout_GetRealOffset(StartingObject, OffsetType, EndParent)            {                var realValue=0;                if (!EndParent) EndParent=document.body;                for (var currentObject=StartingObject; currentObject &amp;&amp; currentObject !=EndParent &amp;&amp; currentObject != document.body; currentObject=currentObject.offsetParent)                {                    var offset = eval('currentObject.offset'+OffsetType);                    if (offset) realValue+=offset;                }                return realValue;            }        &lt;/script&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8963401326226963433?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8963401326226963433/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8963401326226963433' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8963401326226963433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8963401326226963433'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/06/sharepoint-css-y-error-javascript-al.html' title='SharePoint css y error javascript al mover webparts'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-6892536804083130516</id><published>2010-06-15T06:24:00.000-07:00</published><updated>2010-09-21T02:23:20.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Updating SPListItem</title><content type='html'>En un proyecto en el que estoy trabajando me he encontrado con la necesidad de añadir datos a listas en tiempo de despliegue, a partir de un archivo xml, más o menos como lo que haria la feature listinstance cuando le especificamos un child element data.   &lt;br /&gt;  &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms476062.aspx"&gt;Más info...&lt;/a&gt;   &lt;p&gt;Una vez leído este fichero xml obtenemos un diccionario key-value, con los fields (keys) de nuestro item y sus valores (value), en nuestro caso ambos serian string. &lt;/p&gt;  &lt;p&gt;El problema con el que nos encontramos es que en un SPListItem almacenamos objects, y por lo tanto tendriamos que parsear de alguna forma nuestros strings al tipo de campo que requiere ese field. Para saberlo necesitamos consultar el SPField y este SPField tiene un SPFieldValueType que nos permite determinar el tipo de dato que se almacena en ese campo. Luego añadimos un poco de reflection y utilizamos una función muy interesante que he descubierto, &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.changetype.aspx"&gt;Convert.ChangeType&lt;/a&gt;, que permite cambiar de un tipo a otro, y eureka!!! Tenemos un extensión method super útil.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre class="brush: csharp"&gt;/// &lt;summary&gt;&lt;br /&gt;        /// Update an item using a dictionary with key-value pairs&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="item" /&gt;The item&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="data" /&gt;The data collection&lt;/param&gt;&lt;br /&gt;        public static void Update(this SPListItem item, Dictionary&lt;string , String&gt; data)&lt;br /&gt;        {&lt;br /&gt;            bool overwriteVersion = false;&lt;br /&gt;&lt;br /&gt;            foreach (String internalFieldName in data.Keys)&lt;br /&gt;            {&lt;br /&gt;                if (item.Fields.Contains(internalFieldName))&lt;br /&gt;                {&lt;br /&gt;                    SPField field = item.Fields.GetFieldByInternalName(internalFieldName);&lt;br /&gt;&lt;br /&gt;                    ConstructorInfo constructor = field.FieldValueType.GetConstructor(new Type[] { typeof(string) });&lt;br /&gt;&lt;br /&gt;                    if (constructor != null)&lt;br /&gt;                    {&lt;br /&gt;                        item[internalFieldName] = constructor.Invoke(new object[] { data[internalFieldName]});&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        item[internalFieldName] = Convert.ChangeType(data[internalFieldName], field.FieldValueType, CultureInfo.InvariantCulture);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    if (field.ReadOnlyField || field.Type == SPFieldType.Computed) overwriteVersion = true;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (overwriteVersion) item.UpdateOverwriteVersion();&lt;br /&gt;            else item.Update();&lt;br /&gt;        }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-6892536804083130516?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/6892536804083130516/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=6892536804083130516' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6892536804083130516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/6892536804083130516'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/06/updating-splistitem.html' title='Updating SPListItem'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-5727969645416171074</id><published>2010-06-09T03:02:00.001-07:00</published><updated>2010-06-09T03:41:57.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Expresiones regulares</title><content type='html'>Hoy en un proyecto he tendio que buscar un texto dentro una cadena que cumpla un determinado patrón, bueno esto como seguramente todos conocen lo podemos solventar utilizando expresiones regulares. La verdad es que nunca me ha gustado batallar con expresiones regulares, pero creo que son de gran utilidad para estos casos.&lt;br /&gt;&lt;br /&gt;He estado buscando en la red alguna herramienta que sea de ayuda a la hora de elaborar estas expresiones regulares y he encontrado esta herramienta online que me ha venido muy bien: &lt;a href="http://gskinner.com/RegExr/"&gt;http://gskinner.com/RegExr/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Supongo que como esta, habrán otras muchas herramientas similares.&lt;br /&gt;&lt;br /&gt;Hago también una mención especial a la siguiente web site ya que me ha servido de gran ayuda http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-5727969645416171074?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/5727969645416171074/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=5727969645416171074' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5727969645416171074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5727969645416171074'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/06/expresiones-regulares.html' title='Expresiones regulares'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8699519097030904928</id><published>2010-05-17T23:31:00.000-07:00</published><updated>2010-09-21T02:24:10.761-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>SPGridView con generic list</title><content type='html'>Yo soy de esas personas que me gusta trabajar con objetos POCO, me gusta la frase que decía Einstein: "Se debe hacer todo tan sencillo como sea posible, pero no más sencillo", no me gustan las estructuras de datos como pueden ser los datatable y otros objetos del estilo.&lt;br /&gt;&lt;br /&gt;Parece que trabajar con SharePoint y no usar tipos de datos como datatables es algo imposible, pero no es así, y este post es una pequeña explicación de como usar listas genéricas (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx) como datasource de un SPGridView y no perder funcionalidades tales como Paging, Filtering, Sorting, etc.&lt;br /&gt;&lt;br /&gt;Para ello hacemos uso de LinqDataSource que de una manera muy simple nos permite asignar una lista genérica al datasource y un único método para obtener los datos (a partir del evento Selecting). Esto implica tener habilitadas las extensiones del framework 3.5 en nuestro entorno SharePoint, para ello podemos utilizar la solución de codeplex: http://features.codeplex.com/&lt;br /&gt;&lt;br /&gt;Para ello imaginemos que partimos de la siguiente classe Foo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;public class Foo&lt;br /&gt;    {&lt;br /&gt;        public String Field1 { get; set; }&lt;br /&gt;        public String Field2 { get; set; }&lt;br /&gt;&lt;br /&gt;        public Foo()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Foo(String Field1, String Field2)&lt;br /&gt;        {&lt;br /&gt;            this.Field1 = Field1;&lt;br /&gt;            this.Field2 = Field2;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para el ejemplo hemos hecho una simple webpart, que renderiza una SPGridView, donde le hemos asignado como datasource un LinqDataSource que contiene nuestra lista genérica de objetos Foo.&lt;br /&gt;&lt;br /&gt;Para ello simplemente hemos sobreescrito el método CreateChildControls, en el creamos nuestro SPGridView y le asignamos propiedades como filtering, sorting, paging, etc. y creamos nuestro datasource, añadimos tanto el datasource, como el SPGridView a la coleción de controles de la webpart y hacemos un bind entre la grid y el datasource. Además de esto creamos un event handler para el evento Selecting del DataSource, este evento permitirá obtener los datos.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;&lt;br /&gt;namespace MyWebparts&lt;br /&gt;{&lt;br /&gt;    public class FooWebpart: System.Web.UI.WebControls.WebParts.WebPart&lt;br /&gt;    {&lt;br /&gt;        #region Variables&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// The grid&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        private SPGridView myGrid;&lt;br /&gt;        &lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// The datasource&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        private LinqDataSource lqDataSource;&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        public FooWebpart()&lt;br /&gt;        {&lt;br /&gt;            this.ExportMode = WebPartExportMode.All;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected override void CreateChildControls()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            // Set basic gridview properties&lt;br /&gt;            myGrid = new SPGridView();&lt;br /&gt;            myGrid.ID = "MyGrid";&lt;br /&gt;            myGrid.AutoGenerateColumns = false;&lt;br /&gt;&lt;br /&gt;            // Set properties for sorting&lt;br /&gt;            myGrid.AllowSorting = true;&lt;br /&gt;&lt;br /&gt;            // Set properties for paging&lt;br /&gt;            myGrid.AllowPaging = true;&lt;br /&gt;            myGrid.PageSize = 25;&lt;br /&gt;            myGrid.PagerSettings.Mode = PagerButtons.NumericFirstLast;&lt;br /&gt;&lt;br /&gt;            // Set properties for filtering&lt;br /&gt;            myGrid.AllowFiltering = true;&lt;br /&gt;            myGrid.FilterDataFields = "Field1, Field2";&lt;br /&gt;            myGrid.FilteredDataSourcePropertyName = "Where";&lt;br /&gt;            myGrid.FilteredDataSourcePropertyFormat = "{1} == \"{0}\"";&lt;br /&gt;&lt;br /&gt;            // Set columns of the SPGridView&lt;br /&gt;            SPBoundField bfield1 = new SPBoundField();&lt;br /&gt;            bfield1.DataField = "Field1";&lt;br /&gt;            bfield1.HeaderText = "Field1";&lt;br /&gt;            bfield1.SortExpression = "Field1";&lt;br /&gt;            myGrid.Columns.Add(bfield1);&lt;br /&gt;&lt;br /&gt;            SPBoundField bfield2 = new SPBoundField();&lt;br /&gt;            bfield2.DataField = "Field2";&lt;br /&gt;            bfield2.HeaderText = "Field2";&lt;br /&gt;            bfield2.SortExpression = "Field2";&lt;br /&gt;            myGrid.Columns.Add(bfield2);&lt;br /&gt;&lt;br /&gt;            // Create the linqDatasource &lt;br /&gt;            lqDataSource = new LinqDataSource();&lt;br /&gt;            lqDataSource.ID = "MyLinqDS";&lt;br /&gt;            lqDataSource.Selecting += new EventHandler&lt;LinqDataSourceSelectEventArgs&gt;(lqDataSource_Selecting);&lt;br /&gt;&lt;br /&gt;            // Add datasource to controls collection&lt;br /&gt;            Controls.Add(lqDataSource);&lt;br /&gt;&lt;br /&gt;            // Bind SPGridView to linqdatasource&lt;br /&gt;            myGrid.DataSourceID = lqDataSource.ID;&lt;br /&gt;            Controls.Add(myGrid);&lt;br /&gt;&lt;br /&gt;            myGrid.PagerTemplate = null;&lt;br /&gt;&lt;br /&gt;            base.CreateChildControls();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void lqDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            List&lt;Foo&gt; myGenericList = new List&lt;Foo&gt;();&lt;br /&gt;            myGenericList.Add(new Foo("uno", "uno"));&lt;br /&gt;            myGenericList.Add(new Foo("dos", "dos"));&lt;br /&gt;&lt;br /&gt;            e.Result = myGenericList;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8699519097030904928?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8699519097030904928/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8699519097030904928' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8699519097030904928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8699519097030904928'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/05/spgridview-con-generic-list.html' title='SPGridView con generic list'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7112550494524173403</id><published>2010-05-10T01:13:00.000-07:00</published><updated>2010-09-21T02:25:54.232-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>jquery, ajax, json y sharepoint</title><content type='html'>Una forma de implementar una llamada AJAX desde jquery dentro de nuestro entorno MOSS es a través de un httplander.&lt;br /&gt;&lt;br /&gt;La llamada jquery va a enviar un conjunto de datos en formato JSON y va a recibir otros datos también en JSON, por lo que tendremos que serializar y deserializar este json en nuestro código servidor.&lt;br /&gt;&lt;br /&gt;Vamos a intentar describir todo el procedimiento a partir de un ejemplo, este ejemplo será la implementación de un cascading dropdownlist, primero tendremos un dropdownlist que muestra un conjunto de categorias y al seleccionar una categoria concreta luego otro dropdownlist mostrará las subcategorias presentes para esa categoria. (Típico ejemplo) Todo esto lo haremos dentro de un user control.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. User control (ascx)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_Pr5OkOx_Vdo/S-fTx_ANlkI/AAAAAAAAAEM/wZ4ybE_ewSg/s1600/usercontrol.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 184px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5469573128144131650" border="0" alt="" src="http://2.bp.blogspot.com/_Pr5OkOx_Vdo/S-fTx_ANlkI/AAAAAAAAAEM/wZ4ybE_ewSg/s400/usercontrol.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;A continuación se muestra el código jquery para hacer la llamad ajax a un web handler llamado FooHandler.ashx.&lt;br /&gt;&lt;br /&gt;Veremos que este código JavaScript tiene dos partes una es el bind de la acción change y keyup al dropdownlist categorias y otra es la llamada ajax al web handler.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: jscript"&gt;&lt;br /&gt;&lt;br /&gt;$(function() {&lt;br /&gt;        // DropDownLists&lt;br /&gt;        var $ddlCategories = $("#&lt;%= DDLCategories.ClientID %&gt;");&lt;br /&gt;        var $ddlSubCategories = $("#DDLSubCategories");&lt;br /&gt;&lt;br /&gt;        // Labels&lt;br /&gt;        var $LBSubCategories = $("#&lt;%= LBSubCategories.ClientID %&gt;");&lt;br /&gt;       &lt;br /&gt;        $ddlCategories.focus();&lt;br /&gt;        $ddlCategories.bind("change keyup", function() {&lt;br /&gt;            if ($(this).val() != "0") {&lt;br /&gt;&lt;br /&gt;                loadSubCategoriesProducts($("#&lt;%= DDLCategories.ClientID %&gt; option:selected").val());&lt;br /&gt;                $LBSubCategories.fadeIn("slow");&lt;br /&gt;                $ddlSubCategories.fadeIn("slow");&lt;br /&gt;&lt;br /&gt;            } else {&lt;br /&gt;                // Hide the others dropdownlists and labels&lt;br /&gt;                $LBSubCategories.fadeOut("slow");&lt;br /&gt;                $ddlSubCategories.fadeOut("slow");&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;      &lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;    function loadSubCategoriesProducts(selectedItem) {&lt;br /&gt;        $.ajax({&lt;br /&gt;            type: "POST",&lt;br /&gt;            url: '_layouts/Handlers/FooHandler.ashx',&lt;br /&gt;            data: "{ method: 'GetSubCategories', ID: '" + selectedItem + "'}",&lt;br /&gt;            contentType: "application/json; charset=utf-8",&lt;br /&gt;            dataType: "json",&lt;br /&gt;            async: true,&lt;br /&gt;            success: function(data) {&lt;br /&gt;                $("#DDLSubCategories").children().remove();&lt;br /&gt;                for (var i = 0; i &lt; val =" data[i].Id;" text =" data[i].Title;"&gt;&lt;/option&gt;").val(val).html(text));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.1 User control (code behind)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Nuestro user control en el code behind sólo tendrá la carga inicial de las categorias en el primer dropdown:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt; &lt;br /&gt;&lt;br /&gt;public class FOOCodeBehind: UserControl&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        #region Protected Fields&lt;br /&gt;&lt;br /&gt;        protected DropDownList DDLCategories;&lt;br /&gt;        &lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        #region Overriden Methods&lt;br /&gt;&lt;br /&gt;        protected override void CreateChildControls()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            base.CreateChildControls();&lt;br /&gt;&lt;br /&gt;            DDLCategories.DataSource = GetCategories();&lt;br /&gt;            DDLCategories.DataTextField = "Title";&lt;br /&gt;            DDLCategories.DataValueField = "Id";&lt;br /&gt;            DDLCategories.DataBind();&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        #region Private Methods&lt;br /&gt;&lt;br /&gt;        private List&lt;GBSTCategory&gt; GetCategories()&lt;br /&gt;        {&lt;br /&gt;            var categories = new List&lt;Category&gt;();&lt;br /&gt;&lt;br /&gt;            categories.Add(new Category("1", "Category1"));&lt;br /&gt;            categories.Add(new Category("2", "Category2"));&lt;br /&gt;            categories.Add(new Category("3", "Category3"));&lt;br /&gt;            categories.Add(new Category("4", "Category4"));&lt;br /&gt;&lt;br /&gt;            return categories;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Ahora toca definir el handler que hemos llamado FooHandler.ashx. Como podéis observar en la llamada Ajax, esto en realidad es una página (.ashx) que esta dentro del folder Handlers que a la vez esta dentro del folder layouts del folder 12 de MOSS.&lt;br /&gt;&lt;br /&gt;Esta página simplemente contendrá lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Pr5OkOx_Vdo/S-fX0VVYWgI/AAAAAAAAAEU/OZoH1XfXV20/s1600/webhandler.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 16px;" src="http://3.bp.blogspot.com/_Pr5OkOx_Vdo/S-fX0VVYWgI/AAAAAAAAAEU/OZoH1XfXV20/s400/webhandler.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5469577566544747010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2.1 Code Behind Web Handler&lt;br /&gt;&lt;br /&gt;Aquí necesitaremos implementar nuestro handler, este será una clase que derive de IHttpHandler e implemente el método ProcessRequest. &lt;br /&gt;Este método comprobará si el content type recibido es de tipo json, y entonces deserializará lo que hemos recibido en el inputstream a un diccionario key, value, donde las claves son strings y los values objects.&lt;br /&gt;&lt;br /&gt;Para eso hemos creado un extensión de object que serializa y deserializa json. Esta extensión en el código lo tenemos cuando hemos añadido la referencia Core.JSON, esta es una referencia propia, pero tranquilos que también añado el código:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt; &lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web;&lt;br /&gt;using Core.JSON;&lt;br /&gt;&lt;br /&gt;namespace MyHandlers&lt;br /&gt;{&lt;br /&gt;    public class FooHandler: IHttpHandler&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        #region IHttpHandler Members&lt;br /&gt;&lt;br /&gt;        bool IHttpHandler.IsReusable&lt;br /&gt;        {&lt;br /&gt;            get { return true; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void IHttpHandler.ProcessRequest(HttpContext context)&lt;br /&gt;        {&lt;br /&gt;            if (context.Request.ContentType.Contains("json"))&lt;br /&gt;            {&lt;br /&gt;                var inputStream = new System.IO.StreamReader(context.Request.InputStream);&lt;br /&gt;                var inputJson = inputStream.ReadToEnd();&lt;br /&gt;&lt;br /&gt;                var collectionJson = inputJson.ToObject&lt;Dictionary&lt;string, object&gt;&gt;();&lt;br /&gt;&lt;br /&gt;                context.Response.Clear();&lt;br /&gt;                context.Response.ContentType = "application/json";&lt;br /&gt;&lt;br /&gt;                if (!string.IsNullOrEmpty(collectionJson["method"].ToString()))&lt;br /&gt;                {&lt;br /&gt;                    var json = string.Empty;&lt;br /&gt;&lt;br /&gt;                    switch (collectionJson["method"].ToString())&lt;br /&gt;                    {&lt;br /&gt;                        case "GetSubCategories":&lt;br /&gt;                            json = GetSubCategories(collectionJson["id"].ToString());&lt;br /&gt;                            break;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    context.Response.Write(json);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        #region Private Methods&lt;br /&gt;&lt;br /&gt;        private string GetSubCategories(String id)&lt;br /&gt;        {&lt;br /&gt;            var subcategories = new List&lt;SubCategory&gt;();&lt;br /&gt;&lt;br /&gt;            subcategories.Add(new SubCategory("1", "SubCategory 1"));&lt;br /&gt;            subcategories.Add(new SubCategory("2", "SubCategory 2"));&lt;br /&gt;            subcategories.Add(new SubCategory("3", "SubCategory 3"));&lt;br /&gt;            subcategories.Add(new SubCategory("4", "SubCategory 4"));&lt;br /&gt;&lt;br /&gt;            return subcategories.ToJSON();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Extension methods para serializar/deserializar JSON&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt; &lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web.Script.Serialization;&lt;br /&gt;&lt;br /&gt;namespace Core.JSON&lt;br /&gt;{&lt;br /&gt;    public static class ojectExtensionJSON&lt;br /&gt;    {&lt;br /&gt;        public static string ToJSON(this object obj)&lt;br /&gt;        {&lt;br /&gt;            JavaScriptSerializer serializer = new JavaScriptSerializer();&lt;br /&gt;            return serializer.Serialize(obj);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static string ToJSON(this object obj, int recursionLimit)&lt;br /&gt;        {&lt;br /&gt;            JavaScriptSerializer serializer = new JavaScriptSerializer();&lt;br /&gt;            serializer.RecursionLimit = recursionLimit;&lt;br /&gt;            return serializer.Serialize(obj);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static T ToObject&lt;T&gt;(this string json)&lt;br /&gt;        {&lt;br /&gt;            JavaScriptSerializer serializer = new JavaScriptSerializer();&lt;br /&gt;            return serializer.Deserialize&lt;T&gt;(json);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7112550494524173403?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7112550494524173403/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7112550494524173403' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7112550494524173403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7112550494524173403'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/05/jquery-ajax-json-y-sharepoint.html' title='jquery, ajax, json y sharepoint'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pr5OkOx_Vdo/S-fTx_ANlkI/AAAAAAAAAEM/wZ4ybE_ewSg/s72-c/usercontrol.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-3677189730558161092</id><published>2010-04-29T02:15:00.000-07:00</published><updated>2010-09-21T02:33:30.327-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Popup para seleccionar lista</title><content type='html'>Alguna vez nos hemos preguntado como mostrar una propiedad que nos permita seleccionar una lista dentro de la site collection, de la misma forma que hace la content query webpart "CQWP". El siguiente post intentará mostrar como hacer esto:&lt;br /&gt;&lt;br /&gt;Lo primero que se ha hecho es crear un editor part que carga un user control, este user control tendría que tener un textbox para añadir la url de la lista, y un botón que llame a un javascript, en nuestro caso "launchpicker" que nos permita mostrar el popup.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: jscript"&gt;&lt;br /&gt;&lt;br /&gt;var lastSelectedListSmtPickerId = '';&lt;br /&gt;&lt;br /&gt;    function launchPicker(id) {&lt;br /&gt;        &lt;br /&gt;        if (!document.getElementById) return;&lt;br /&gt;&lt;br /&gt;        var listurlfield = document.getElementById(id);&lt;br /&gt;        var defaulturl = '&lt;%=SPContext.Current.Web.ServerRelativeUrl %&gt;';&lt;br /&gt;&lt;br /&gt;        var url = defaulturl;&lt;br /&gt;&lt;br /&gt;        if (listurlfield != null &amp;&amp; listurlfield.value != '') {&lt;br /&gt;            url = listurlfield.value.substring(0, listurlfield.value.lastIndexOf('/'));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        var callback = function(results) {&lt;br /&gt;            if (results == null || results == undefined || results[1] == null || results[2] == null) return;&lt;br /&gt;&lt;br /&gt;            lastSelectedListSmtPickerId = results[0];&lt;br /&gt;            var listUrl = '/';&lt;br /&gt;            if (results[1].charAt(0) == '/') results[1] = results[1].substring(1);&lt;br /&gt;            listUrl = listUrl + results[1];&lt;br /&gt;            if (listUrl.substring(listUrl.length - 1) != '/') listUrl = listUrl + '/';&lt;br /&gt;            if (results[2].charAt(0) == '/') results[2] = results[2].substring(1);&lt;br /&gt;            listUrl = listUrl + results[2];&lt;br /&gt;            listurlfield.value = listUrl;&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        LaunchPickerTreeDialog('CbqPickerSelectListTitle', 'CbqPickerSelectListTitle', 'listsOnly', '', url, lastSelectedListSmtPickerId, '', '', '/_layouts/images/smt_icon.gif', '', callback);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Luego nuestra editor part tendría que cargar dinámicamente este user control que hemos creado, además ha de implementar los métodos Synchanges, de donde obtendremos el valor actual configurado en la webpart y el método ApplyChanges donde haremos un set de la propiedad de la webpart.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp" &gt;&lt;br /&gt;&lt;br /&gt;public class FooEditorPart: EditorPart&lt;br /&gt;    {&lt;br /&gt;        #region Fields&lt;br /&gt;&lt;br /&gt;        protected GetListUserControl editorUC;&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;        &lt;br /&gt;        #region Constructor&lt;br /&gt;&lt;br /&gt;        public FooEditorPart(string webpartid)&lt;br /&gt;        {&lt;br /&gt;            this.ID = "FooEditorPart" + webpartid;&lt;br /&gt;            this.Title = "Link Editor";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        #region Overriden Methods&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Create the controls&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected override void CreateChildControls()&lt;br /&gt;        {&lt;br /&gt;            base.CreateChildControls();&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                editorUC = (GetListUserControl)this.Page.LoadControl("~/_CONTROLTEMPLATES/GetListUserControl.ascx");&lt;br /&gt;&lt;br /&gt;                Controls.Add(editorUC);&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                LogHelper(ex)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Get the value from webpart&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        public override void SyncChanges()&lt;br /&gt;        {&lt;br /&gt;            EnsureChildControls();&lt;br /&gt;&lt;br /&gt;            WebpartFoo webPart = WebPartToEdit as WebpartFoo;&lt;br /&gt;            if (webPart != null)&lt;br /&gt;            {&lt;br /&gt;                editorUC.TbListUrl.Text = webPart.LinkList;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// ApplyChanges in webpart&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        public override bool ApplyChanges()&lt;br /&gt;        {&lt;br /&gt;            EnsureChildControls();&lt;br /&gt;            WebpartFoo webPart = WebPartToEdit as WebpartFoo;&lt;br /&gt;            if (webPart != null)&lt;br /&gt;            {&lt;br /&gt;                webPart.LinkList= editorUC.TbListUrl.Text;&lt;br /&gt;            }&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por último nuestra webpart tendrá que tener una propiedad string con el atributo WebBrowsable(false), y tendrá que implementar la interfaz IWebEditable, esto nos obliga a implementar el método CreateEditorParts, donde añadiremos nuestro nuevo editor part, y la propiedad WebBrowsableObject.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;public class WebpartFoo: WebPart, IWebEditable&lt;br /&gt;    {&lt;br /&gt;        #region Properties&lt;br /&gt;&lt;br /&gt;        [Personalizable(PersonalizationScope.Shared)]&lt;br /&gt;        [WebBrowsable(false)]&lt;br /&gt;        public string LinkList { get; set; }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        #region Default Constructor&lt;br /&gt;        public WebpartFoo()&lt;br /&gt;        {&lt;br /&gt;            ExportMode = WebPartExportMode.All;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;        #region IWebEditable Members&lt;br /&gt;&lt;br /&gt;        EditorPartCollection IWebEditable.CreateEditorParts()&lt;br /&gt;        {&lt;br /&gt;            List&lt;EditorPart&gt; editors = new List&lt;EditorPart&gt;();&lt;br /&gt;&lt;br /&gt;            // Add the base editor parts&lt;br /&gt;            EditorPartCollection baseParts = base.CreateEditorParts();&lt;br /&gt;            foreach (EditorPart basePart in baseParts)&lt;br /&gt;                editors.Add(basePart);&lt;br /&gt;&lt;br /&gt;            editors.Add(new FooEditorPart(this.ID));&lt;br /&gt;            return new EditorPartCollection(editors);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        object IWebEditable.WebBrowsableObject&lt;br /&gt;        {&lt;br /&gt;            get { return this; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A partir de aquí ya podriamos usar nuestra lista seleccionada, cómo curiosidad, remarcar que el popup al obtener la url de la lista no le añade el /Lists ni la url correcta de la lista, sino que le añade el title de la lista, por lo que para poder desde codigo obtener la lista podriamos hacer algo como lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;private void foo()&lt;br /&gt;        {&lt;br /&gt;            if (!String.IsNullOrEmpty(LinkList))&lt;br /&gt;            {&lt;br /&gt;                string UrlWeb = LinkList.Substring(0, LinkList.LastIndexOf("/"));&lt;br /&gt;                string ListName = LinkList.Substring(LinkList.LastIndexOf("/") + 1);&lt;br /&gt;&lt;br /&gt;                using (SPWeb web = SPContext.Current.Site.OpenWeb(UrlWeb))&lt;br /&gt;                {&lt;br /&gt;                    SPList list = web.Lists[ListName];&lt;br /&gt;&lt;br /&gt;                    // TODO&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-3677189730558161092?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/3677189730558161092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=3677189730558161092' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3677189730558161092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3677189730558161092'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/04/popup-para-seleccionar-lista.html' title='Popup para seleccionar lista'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-2931589525762085451</id><published>2010-04-16T00:23:00.000-07:00</published><updated>2010-04-16T02:15:31.037-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Crear exclude crawling rules programmatically</title><content type='html'>Añadir "exclude crawling rules" es muy sencillo.&lt;br /&gt;&lt;br /&gt;Los pasos a seguir serían los siguiente:&lt;br /&gt;&lt;br /&gt;1. Obtener el Search Context&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;//get the site SSP's search server instance&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;SearchContext&lt;/span&gt; searchContext = &lt;span style="color:#3366ff;"&gt;SearchContext&lt;/span&gt;.GetContext(site);&lt;br /&gt;&lt;br /&gt;2. Obtener el Content Source&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;//get the content source for the search server&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Content&lt;/span&gt; sspContent = &lt;span style="color:#000099;"&gt;new&lt;/span&gt; &lt;span style="color:#3366ff;"&gt;Content&lt;/span&gt;(searchContext);&lt;br /&gt;&lt;br /&gt;3. Añadir la crawl rule a la colección de crawlrules del content source&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;string&lt;/span&gt; rule = &lt;span style="color:#660000;"&gt;"http://*/forms/*"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#009900;"&gt;//create the crawl rule, setting the type of crawl rule and the crawl rule string&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;CrawlRule&lt;/span&gt; crawlRule = sspContent.CrawlRules.Create(&lt;span style="color:#3366ff;"&gt;CrawlRuleType&lt;/span&gt;.ExclusionRule, rule);&lt;br /&gt;&lt;br /&gt;4. Añadir propiedades&lt;br /&gt;&lt;br /&gt;crawlRule.FollowComplexUrls = &lt;span style="color:#000099;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;5. Commit la regla en la base de datos&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;//commit the rule in the database&lt;/span&gt;&lt;br /&gt;crawlRule.Update();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta información ha sido extraída del siguiente blog:&lt;br /&gt;&lt;br /&gt;http://blog.richfinn.net/blog/2008/06/19/CreateSearchCrawlRulesProgrammatically.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-2931589525762085451?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/2931589525762085451/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=2931589525762085451' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2931589525762085451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2931589525762085451'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/04/crear-exclude-crawling-rules.html' title='Crear exclude crawling rules programmatically'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8120103758059655527</id><published>2010-04-13T01:12:00.000-07:00</published><updated>2010-04-13T01:15:46.984-07:00</updated><title type='text'>FORO DE ARQUITECTOS BARCELONA</title><content type='html'>El próximo 13 de Mayo se hará en Barcelona un FORO DE ARQUITECTOS, donde entre otras cosas se presentará la propuesta Arquitectura DDD N-Layer.&lt;br /&gt;&lt;br /&gt;Podéis registraros en siguiente link:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032446174&amp;amp;Culture=es-ES"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032446174&amp;amp;Culture=es-ES &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8120103758059655527?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8120103758059655527/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8120103758059655527' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8120103758059655527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8120103758059655527'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/04/foro-de-arquitectos-barcelona.html' title='FORO DE ARQUITECTOS BARCELONA'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7696914065780348517</id><published>2010-04-08T23:49:00.000-07:00</published><updated>2010-04-16T02:15:54.262-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>SharePoint fields objects</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;A continuación se muestra una tabla donde se definen los diferentes nombres de classe para cada tipo de datos de MOSS 2007, esta información ha sido extraida del siguiente blog:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tonstegeman.com/Blog/Lists/Posts/Post.aspx?List=70640fe5%2D28d9%2D464f%2Db1c9%2D91e07c8f7e47&amp;amp;ID=32"&gt;http://www.tonstegeman.com/Blog/Lists/Posts/Post.aspx?List=70640fe5%2D28d9%2D464f%2Db1c9%2D91e07c8f7e47&amp;amp;ID=32&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 333px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5458029242386354290" border="0" alt="" src="http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S77QrZYiEHI/AAAAAAAAAEE/lwCIwo-xle0/s400/mossobjects.png" /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7696914065780348517?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7696914065780348517/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7696914065780348517' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7696914065780348517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7696914065780348517'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/04/sharepoint-fields-objects.html' title='SharePoint fields objects'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S77QrZYiEHI/AAAAAAAAAEE/lwCIwo-xle0/s72-c/mossobjects.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-5725483714553392797</id><published>2010-04-07T07:46:00.000-07:00</published><updated>2010-04-16T02:16:40.001-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Evitar pop-up warning al editar un item</title><content type='html'>Hoy me he encontrado un problema al editar un item, este item tiene un custom field que hace postback, y al hacerlo me aparece el siguiente mensaje:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 398px; DISPLAY: block; HEIGHT: 150px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5457408804922946194" border="0" alt="" src="http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S7ycZLuFcpI/AAAAAAAAADk/Jl0IqylL5zI/s400/warning.png" /&gt;&lt;br /&gt;&lt;br /&gt;Si pulsamos cancelar no hay problema, pero al pulsar OK, esto implica que aparezca el siguiente error al intentar luego guardar el item.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 191px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5457410898261048322" border="0" alt="" src="http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S7yeTCAx_AI/AAAAAAAAADs/mUnc9V27A8o/s400/error.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La solución la he extraido de una respuesta de un conocido amigo (Edin Kapic) en un foro. Añado enlace al post original: &lt;a href="http://social.msdn.microsoft.com/Forums/es-ES/mossdeves/thread/3d46ab13-b821-4f31-939a-678eb30be81f"&gt;http://social.msdn.microsoft.com/Forums/es-ES/mossdeves/thread/3d46ab13-b821-4f31-939a-678eb30be81f&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El &lt;strong&gt;problema &lt;/strong&gt;viene dado que cuando tenemos la feature de publishing activada, se añade un javascript que nos controla cuando estamos en edición y nos pregunta antes de salir de la página, si queremos guardar los cambios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La &lt;strong&gt;solución&lt;/strong&gt; es desactivar la feature de publishing o añadir un tag script en nuestra página donde ponga la variable g_bWarnBeforeLeave a false, ya que es esta variable por la que pregunta el javascript antes mencionado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-5725483714553392797?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/5725483714553392797/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=5725483714553392797' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5725483714553392797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5725483714553392797'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/04/evitar-pop-up-warning-al-editar-un-item.html' title='Evitar pop-up warning al editar un item'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S7ycZLuFcpI/AAAAAAAAADk/Jl0IqylL5zI/s72-c/warning.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7532590611830967476</id><published>2010-03-15T04:50:00.000-07:00</published><updated>2010-09-21T02:40:03.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xsd'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='xsd2code generator'/><category scheme='http://www.blogger.com/atom/ns#' term='visual studio 2008'/><title type='text'>XSD2Code Generator</title><content type='html'>&lt;a href="http://xsd2code.codeplex.com/"&gt;XSD2Code Generator&lt;/a&gt; es una herramienta que nos permite generar business class a partir de schemas xml (ficheros .xsd). Es una evolución de la herramienta xsd.exe que viene con nuestra instalación de visual studio.&lt;br /&gt;&lt;br /&gt;Cómo características a resaltar respecto a la herramienta xsd.exe es que soporta generics y custom collections. Cuando generamos classes con xsd, xsd.exe nos generaba clases con atributos del tipo array, mientras que xsd2code nos genera clases con propiedades del tipo List&lt;t&gt;. Además se nos añade como un Addin para visual studio 2008.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 293px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5448828726794539042" border="0" alt="" src="http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S54g256IUCI/AAAAAAAAADc/Qz1iykBDszw/s400/AddinMenu.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Un ejemplo bien secillo de su uso sería el siguiente:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;1. Obtener o generar un xml para el que queremos generar la classe que lo serialize / deserialize.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: xml" &gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8" ?&gt;&lt;br /&gt;&lt;fooclass attribute1="atribute1"&gt;&lt;br /&gt;  &lt;foosubclasses&gt;&lt;br /&gt;    &lt;foosubclass&gt;&lt;br /&gt;      &lt;field1&gt;foo1&lt;/field1&gt;&lt;br /&gt;      &lt;field2&gt;foo2&lt;/field2&gt;&lt;br /&gt;    &lt;/foosubclass&gt;&lt;br /&gt;    &lt;foosubclass&gt;&lt;br /&gt;      &lt;field1&gt;foo1&lt;/field1&gt;&lt;br /&gt;      &lt;field2&gt;foo2&lt;/field2&gt;&lt;br /&gt;    &lt;/foosubclass&gt;&lt;br /&gt;  &lt;/foosubclasses&gt;&lt;br /&gt;&lt;/fooclass&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;2. Generar el schema (fichero .xsd) Menú XML &gt; Create Schema, se nos generará un archivo cómo el siguiente.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;?xml:namespace prefix = xs /&gt;&lt;xs:schema attributeformdefault="unqualified" elementformdefault="qualified" xs="http://www.w3.org/2001/XMLSchema"&gt;&lt;br /&gt;  &lt;xs:element name="FooClass"&gt;&lt;br /&gt;    &lt;xs:complextype&gt;&lt;br /&gt;      &lt;xs:sequence&gt;&lt;br /&gt;        &lt;xs:element name="FooSubClasses"&gt;&lt;br /&gt;          &lt;xs:complextype&gt;&lt;br /&gt;            &lt;xs:sequence&gt;&lt;br /&gt;              &lt;xs:element name="FooSubClass" maxoccurs="unbounded"&gt;&lt;br /&gt;                &lt;xs:complextype&gt;&lt;br /&gt;                  &lt;xs:sequence&gt;&lt;br /&gt;                    &lt;xs:element name="field1" type="xs:string"&gt;&lt;/xs:element&gt;&lt;br /&gt;                    &lt;xs:element name="field2" type="xs:string"&gt;&lt;/xs:element&gt;&lt;br /&gt;                  &lt;/xs:sequence&gt;&lt;br /&gt;                &lt;/xs:complextype&gt;&lt;br /&gt;              &lt;/xs:element&gt;&lt;br /&gt;            &lt;/xs:sequence&gt;&lt;br /&gt;          &lt;/xs:complextype&gt;&lt;br /&gt;        &lt;/xs:element&gt;&lt;br /&gt;      &lt;/xs:sequence&gt;&lt;br /&gt;      &lt;xs:attribute name="Attribute1" type="xs:string" use="required"&gt;&lt;/xs:attribute&gt;&lt;br /&gt;    &lt;/xs:complextype&gt;&lt;br /&gt;  &lt;/xs:element&gt;&lt;br /&gt;&lt;/xs:schema&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;3. Por último hacemos botón derecho sobre el fichero .xsd desde el solution explorer y pulsamos la opción Run xsd2code generation. Se nos abrirá una ventana modal donde podemos elegir las propiedades para la generación del código, como por ejemplo el lenguaje, si queremos una clase base, etc. A continuación muestro un trozo de código generado con esta herramienta.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;namespace prueba {&lt;br /&gt;      &lt;br /&gt;    public partial class FooClass {&lt;br /&gt;      &lt;br /&gt;        private List&lt;fooclassfoosubclass&gt; fooSubClassesField;&lt;br /&gt;      &lt;br /&gt;        private string attribute1Field;&lt;br /&gt;      &lt;br /&gt;        public FooClass() {&lt;br /&gt;            this.fooSubClassesField = new List&lt;fooclassfoosubclass&gt;();&lt;br /&gt;        }&lt;br /&gt;      &lt;br /&gt;        [System.Xml.Serialization.XmlArrayItemAttribute("FooSubClass", IsNullable=false)]&lt;br /&gt;        public List&lt;fooclassfoosubclass&gt; FooSubClasses {&lt;br /&gt;            get {&lt;br /&gt;                return this.fooSubClassesField;&lt;br /&gt;            }&lt;br /&gt;            set {&lt;br /&gt;                this.fooSubClassesField = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;      &lt;br /&gt;        public string Attribute1 {&lt;br /&gt;            get {&lt;br /&gt;                return this.attribute1Field;&lt;br /&gt;            }&lt;br /&gt;            set {&lt;br /&gt;                this.attribute1Field = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public partial class FooClassFooSubClass {&lt;br /&gt;      &lt;br /&gt;        private string field1Field;&lt;br /&gt;      &lt;br /&gt;        private string field2Field;&lt;br /&gt;      &lt;br /&gt;        public string field1 {&lt;br /&gt;            get {&lt;br /&gt;                return this.field1Field;&lt;br /&gt;            }&lt;br /&gt;            set {&lt;br /&gt;                this.field1Field = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;      &lt;br /&gt;        public string field2 {&lt;br /&gt;            get {&lt;br /&gt;                return this.field2Field;&lt;br /&gt;            }&lt;br /&gt;            set {&lt;br /&gt;                this.field2Field = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7532590611830967476?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7532590611830967476/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7532590611830967476' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7532590611830967476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7532590611830967476'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/03/xsd2code-generator.html' title='XSD2Code Generator'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/S54g256IUCI/AAAAAAAAADc/Qz1iykBDszw/s72-c/AddinMenu.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7634380663245596686</id><published>2010-03-09T06:41:00.000-08:00</published><updated>2010-03-09T06:50:11.197-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>ListInstance (FeatureId y TemplateType)</title><content type='html'>Cuando estamos creando una feature para provisionar una lista a nuestra solución MOSS (Element ListInstance), aparecen dos campos de suma importancia:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000066;"&gt;FeatureId&lt;/span&gt;&lt;/strong&gt;: &lt;strong&gt;Text obligatorio&lt;/strong&gt;. Especifica el identificador GUID de la característica. Si no se especifica un GUID de característica, Windows SharePoint Services usa el identificador de la característica predeterminada; en otras palabras, el que contiene el elemento &lt;strong&gt;ListInstance&lt;/strong&gt;. Si la plantilla de lista para la instancia de lista se encuentra dentro de otra característica, se debe especificar el identificador de dicha característica mediante el atributo &lt;strong&gt;FeatureId&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000066;"&gt;TemplateType&lt;/span&gt;&lt;/strong&gt;: &lt;strong&gt;Integer&lt;/strong&gt; obligatorio. Devuelve el identificador del entero de la plantilla de lista que se va a usar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;p&gt;&lt;?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;La siguiente tabla muestra las listas disponibles en MOSS (algunas también en WSS) , sus Type IDS y sus GUIDS.&lt;br /&gt;&lt;br /&gt;&lt;table style="WIDTH: 365pt; BORDER-COLLAPSE: collapse" border="0" cellspacing="0" cellpadding="0" width="486"&gt;&lt;tbody&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl69" height="20" width="60" &gt;&lt;div&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Type ID&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl69" width="209" &gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Description&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 163ptcolor:transparent;" class="xl70" width="217" &gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;GUID of feature&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;100&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Generic list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00bfea71-de22-43b2-a848-c05709900100&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl67" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;101&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Document library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-E717-4E80-AA17-D0C71B360101&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;102&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Survey&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-EB8A-40B1-80C7-506BE7590102&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;103&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Links list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-2062-426C-90BF-714C59600103&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;104&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Announcements list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-D1CE-42de-9C63-A44004CE0104&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;105&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Contacts list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-7E6D-4186-9BA8-C047AC750105&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;106&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Events list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-EC85-4903-972D-EBE475780106&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;107&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Tasks list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-A83E-497E-9BA0-7A5C597D0107&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;108&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Discussion board&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-6A49-43FA-B535-D15C05500108&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;109&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Picture library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-52D4-45B3-B544-B1C71B620109&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;110&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Data sources&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-F381-423D-B9D1-DA7A54C50110&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;111&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Site template gallery&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;SYSTEM&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;113&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Web Part gallery&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;SYSTEM&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;114&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;List template gallery&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;SYSTEM&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;115&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;XML Form library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-1E1D-4562-B56A-F05371BB0115&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;116&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Masterpage and page layouts library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;SYSTEM&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;117&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;No-code workflow library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-F600-43F6-A895-40C0DE7B0117&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;118&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Workflow process list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-2D77-4A75-9FCA-76516689E21A&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;119&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Web page library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-C796-4402-9F2F-0EB9A6E71B18&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;120&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Custom grid for a list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-3A1D-41D3-A0EE-651D11570120&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;130&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Data connection library&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-DBD7-4F72-B8CB-DA7AC0440130&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;140&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Workflow history list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-4EA5-48D4-A4AD-305CF7030140&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;150&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Gantt tasks list&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-513D-4CA0-96C2-6A47775C0119&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="HEIGHT: 15pt" height="20"&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; HEIGHT: 15pt; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 45ptcolor:transparent;" class="xl65" height="20" width="60" align="right" &gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;1100&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-TOP: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: 157ptcolor:transparent;" class="xl66" width="209" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;Issue tracking&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext; BORDER-RIGHT: windowtext 0.5pt solid; BACKGROUND-: windowtextcolor:transparent;" class="xl68" &gt;&lt;span style="font-family:Calibri;font-size:85%;"&gt;00BFEA71-5932-4F9C-AD71-1557E5751100&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7634380663245596686?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7634380663245596686/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7634380663245596686' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7634380663245596686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7634380663245596686'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/03/listinstance-featureid-y-templatetype.html' title='ListInstance (FeatureId y TemplateType)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-2900623919840763197</id><published>2010-03-09T06:18:00.000-08:00</published><updated>2010-03-09T06:23:58.314-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='WINDOWS 2008 SERVER'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>IISAPP.VBS en Windows Server 2008</title><content type='html'>En Windows 2003 Server y IIS 6 disponiamos de un magnifico script para determinar el ID de un worker process, iisapp.vbs, de esta forma poder atacharlo en Visual Studio para debugar. &lt;br /&gt;&lt;br /&gt;Para más información ver: &lt;br /&gt;&lt;br /&gt;http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/b8721f32-696b-4439-9140-7061933afa4b.mspx?mfr=true&lt;br /&gt;&lt;br /&gt;En Windows Server 2008 y IIS 7 esta utilidad ya no existe, pero tenemos otros comandos que nos ofrecen la misma funcionalidad:&lt;br /&gt;&lt;br /&gt;%windir%\system32\inetsrv\appcmd.exe list wp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-2900623919840763197?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/2900623919840763197/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=2900623919840763197' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2900623919840763197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2900623919840763197'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/03/iisappvbs-en-windows-server-2008.html' title='IISAPP.VBS en Windows Server 2008'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8747184665776102312</id><published>2010-03-01T23:47:00.000-08:00</published><updated>2010-09-21T02:41:11.952-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>MOSS 2007: Cómo customizar la página de creación de una lista</title><content type='html'>Es posible modificar la página de creación de una lista, es decir, la página donde especificamos nombre de la lista, descripción, etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Pr5OkOx_Vdo/S4zEEKKbPYI/AAAAAAAAADU/L_EHIyjy_r0/s1600-h/new_aspx.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 354px;" src="http://2.bp.blogspot.com/_Pr5OkOx_Vdo/S4zEEKKbPYI/AAAAAAAAADU/L_EHIyjy_r0/s400/new_aspx.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5443941625310690690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pero la idea, no seria modificar esta página directamente, pues pertenece al core de moss.&lt;br /&gt; &lt;br /&gt;Lo ideal seria crear una nueva definición de lista, y a esta nueva definición de lista indicarle nuestra propia página de creación, dónde podamos especificar los datos que nos sean de utilidad.&lt;br /&gt; &lt;br /&gt;Para ello disponemos de un atributo, NewPage, en el listtemplate:&lt;br /&gt; &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;br /&gt;&lt;Elements xmlns="http://schemas.microsoft.com/sharepoint/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;ListTemplate&lt;br /&gt;&lt;br /&gt;Name="indexlist"&lt;br /&gt;&lt;br /&gt;Type="10010"&lt;br /&gt;&lt;br /&gt;BaseType="0"&lt;br /&gt;&lt;br /&gt;OnQuickLaunch="TRUE"&lt;br /&gt;&lt;br /&gt;SecurityBits="11"&lt;br /&gt;&lt;br /&gt;Sequence="410"&lt;br /&gt;&lt;br /&gt;DisplayName="Index List"&lt;br /&gt;&lt;br /&gt;Description="F4EDocs index list template"&lt;br /&gt;&lt;br /&gt;NewPage="F4E.F4EDocs/NewIndexList.aspx"&lt;br /&gt;&lt;br /&gt;Image="/_layouts/images/itgen.gif"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;/Elements&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Luego tendremos que crear nuestra application page, podriamos partir de la existente en /_layouts/new.aspx, y añadir el comportamiento que deseemos, esta application page tendría que derivar de Microsoft.SharePoint.ApplicationPages.LayoutsPageBase.&lt;br /&gt;&lt;br /&gt;Un ejemplo de esto se explica en:&lt;br /&gt;&lt;br /&gt;http://furuknap.blogspot.com/2009/01/consuming-rss-or-atom-feed-in.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8747184665776102312?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8747184665776102312/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8747184665776102312' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8747184665776102312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8747184665776102312'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/03/moss-2007-como-customizar-la-pagina-de.html' title='MOSS 2007: Cómo customizar la página de creación de una lista'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pr5OkOx_Vdo/S4zEEKKbPYI/AAAAAAAAADU/L_EHIyjy_r0/s72-c/new_aspx.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7289097284168382929</id><published>2010-02-22T09:08:00.000-08:00</published><updated>2010-02-22T09:14:30.519-08:00</updated><title type='text'>New challenge</title><content type='html'>Hoy comienzo un nuevo reto profesional, este reto se llama Spenta Consulting, donde he de decir que desde un primer momento me he sentido como en casa. &lt;br /&gt;&lt;br /&gt;Entre mis compañeros se respira una gran profesionalidad de la que espero formar parte en cuanto tenga oportunidad, es decir en cuanto acabe de aterrizar. Espero estar a la altura de todos ellos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7289097284168382929?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7289097284168382929/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7289097284168382929' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7289097284168382929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7289097284168382929'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2010/02/new-challenge.html' title='New challenge'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-138065071038176012</id><published>2009-08-27T01:40:00.001-07:00</published><updated>2010-09-21T02:42:25.922-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Custom ASP.net Web Application in MOSS</title><content type='html'>Actualmente para un proyecto hemos decidido crear una aplicación web dentro del directorio _layouts de MOSS 2007, nos encontrabamos con el error siguiente al cargar una master page que esta ubicada en el mismo directorio _layouts:&lt;br /&gt;&lt;br /&gt;The referenced file '/TEMPLATE/LAYOUTS/MyWebApp/MyMasterPage.master' is not allowed on this page.   at System.Web.UI.TemplateParser.ProcessError(String message)    at System.Web.UI.BaseTemplateParser.GetReferencedType(VirtualPath virtualPath, Boolean allowNoCompile)    at System.Web.UI.PageParser.ProcessMainDirectiveAttribute(String deviceName, String name, String value, IDictionary parseData)    at System.Web.UI.TemplateParser.ProcessMainDirective(IDictionary mainDirective)&lt;br /&gt;&lt;br /&gt;Para solucionarlo hemos hecho lo siguiente:&lt;br /&gt;&lt;br /&gt;- Modificar el atributo MasterPageFile de la directiva Page de nuestra custom .aspx indicandole la página maestra application.master.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;MasterPageFile="~/_layouts/application.master"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Luego en el fichero .cs (Code Behind) hemos asignado nuestra página maestra en el evento PreInit&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;&lt;br /&gt;protected void Page_PreInit(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;this.MasterPageFile = "~/_layouts/MyWebApp/MyMasterPage.master";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-138065071038176012?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/138065071038176012/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=138065071038176012' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/138065071038176012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/138065071038176012'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/08/custom-aspnet-web-application-in-moss.html' title='Custom ASP.net Web Application in MOSS'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-239061313668706315</id><published>2009-05-28T04:09:00.000-07:00</published><updated>2009-05-28T04:19:10.207-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='W2K3'/><title type='text'>Permisos EventLog</title><content type='html'>Para permitir a los usuarios impersonados escribir en el eventlog, es necesario modificar una clave del registro de windows, en concreto:&lt;br /&gt;&lt;br /&gt;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\MyLogName\CustomSD&lt;br /&gt;&lt;br /&gt;Para permitir a los usuarios autenticados permisos de escritura se ha de aññadir el siguiente permiso:&lt;br /&gt;(A;;0x0002;;;AU)&lt;br /&gt;&lt;br /&gt;Para permitir a un usuario específico permiso de escritura debermos especificar su SID:&lt;br /&gt;(A;;0x0002;;;SID-OF-USER-ACCOUNT)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-239061313668706315?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/239061313668706315/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=239061313668706315' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/239061313668706315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/239061313668706315'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/05/permisos-eventlog.html' title='Permisos EventLog'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-5063760349525957951</id><published>2009-04-21T07:52:00.000-07:00</published><updated>2009-04-21T07:59:13.429-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>CopyUtil.aspx - Una gran Application Page</title><content type='html'>CopyUtil.aspx es una application page dentro de MOSS 2007 que nos permite navegar a un item sabiendo el id del item, el id de la lista, el id de la site y el id de la site collection, esto nos ahorra mucho trabajo a la hora de componer urls hacia los items.&lt;br /&gt;&lt;br /&gt;Para ir a un item concreto tenemos que construir la siguiente URL:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://server/_layouts/CopyUtil.aspx?Use=id&amp;amp;Action=dispform&amp;amp;ItemId=X&amp;amp;ListId=X&amp;amp;WebId=X&amp;amp;SiteId=X"&gt;http://server/_layouts/CopyUtil.aspx?Use=id&amp;amp;Action=dispform&amp;amp;ItemId=&lt;strong&gt;X&lt;/strong&gt;&amp;amp;ListId=&lt;strong&gt;X&lt;/strong&gt;&amp;amp;WebId=&lt;strong&gt;X&lt;/strong&gt;&amp;amp;SiteId=&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;sustituyendo las X por los ID's correspondientes. El parámetro "action" puede ser sustituido por dispform o editform, para que nos rediriga a la URL que nos muestra el item o para que nos rediriga a la URL para editar el item.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-5063760349525957951?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/5063760349525957951/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=5063760349525957951' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5063760349525957951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/5063760349525957951'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/04/copyutilaspx-una-gran-application-page.html' title='CopyUtil.aspx - Una gran Application Page'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-8827441695034337155</id><published>2009-02-12T07:54:00.000-08:00</published><updated>2009-02-12T08:08:58.515-08:00</updated><title type='text'>Error wizard sharepoint</title><content type='html'>Tras instalar el SP1 de MOSS 2007 en una granja de servidores e intentar pasar el wizard de configuración me he encontrado con la siguiente excepción:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Microsoft.SharePoint.Administration.SPUpdatedConcurrencyException was thrown. Additional exception information: An update conflict has occurred, and you must re-try this action. The object DiagnosticsService Parent=SPFarm Name=SharePoint_Config is being updated by Domain\User, in the w3wp process, on machine SERVER. View the tracing log for more information about the conflict. Microsoft.SharePoint.Administration.SPUpdatedConcurrencyException: An update conflict has occurred, and you must re-try this action. The object DiagnosticsService Parent=SPFarm Name=SharePoint_Config is being updated by Domain\User, in the w3wp process, on machine SERVER. View the tracing log for more information about the conflict.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al parecer esto sucede cuando hay un objeto bloqueado a nivel de SPFarm. Para solventar este problema hay que limpiar la cache de configuración de Windows SharePoint Services.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/944267/en-us/"&gt;http://support.microsoft.com/kb/944267/en-us/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¿Y donde se encuentra esta cache?&lt;br /&gt;&lt;br /&gt;Esta caché se encuentra en:&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\All Users\Application Data\Microsoft\SharePoint\Config\[GUID]&lt;br /&gt;&lt;br /&gt;La solución pasa por borrar todos los xml de esta carpeta [CUIDADO NO BORRAR EL ARCHIVO cache.ini], luego se ha de editar el archivo cache.ini y poner un 1 y guardar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/939308/en-us/"&gt;http://support.microsoft.com/kb/939308/en-us/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-8827441695034337155?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/8827441695034337155/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=8827441695034337155' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8827441695034337155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/8827441695034337155'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/02/error-wizard-sharepoint.html' title='Error wizard sharepoint'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-2116711880537237381</id><published>2009-02-05T04:04:00.000-08:00</published><updated>2010-09-21T02:44:21.851-07:00</updated><title type='text'>Copiar items y folders entre DocumentLibrary manteniendo sus campos</title><content type='html'>Me he encontrado en un proyecto en que unas librerías de sharepoint que fueron migradas de 2003 daban un error al intentar mover elementos usando el sitemanger. Vimos que esto no pasaba en las otras librerías por lo que tuvimos que hacer un script para mover documentos y folders de una librería a otra, eso sí manteniendo todos sus metadatos, aquí algunos de los pasos que hemos seguido:&lt;br /&gt;&lt;br /&gt;1. Igualar los campos de las bibliotecas:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;public static void IgualarCampos(SPDocumentLibrary origen, SPDocumentLibrary destino)&lt;br /&gt;{&lt;br /&gt;if (origen == null  destino == null) throw new ArgumentException("Las bibliotecas destino y origen no pueden ser nulas");&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;List&lt;spfield&gt; listaCamposDestino = new List&lt;spfield&gt;();&lt;br /&gt;foreach (SPField field in destino.Fields)&lt;br /&gt;{&lt;br /&gt;listaCamposDestino.Add(field);&lt;br /&gt;}&lt;br /&gt;// Compara con origen y crea las necesarias en destino&lt;br /&gt;foreach (SPField field in origen.Fields)&lt;br /&gt;{&lt;br /&gt;SPField campoBuscado = listaCamposDestino.Find(delegate(SPField campo)&lt;br /&gt;{&lt;br /&gt;return campo.Id == field.Id;&lt;br /&gt;});&lt;br /&gt;// Si no existe lo añadimos&lt;br /&gt;if (campoBuscado == null )&lt;br /&gt;{&lt;br /&gt;// Se crea campo en lista destino.&lt;br /&gt;destino.Fields.Add(field);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;throw ex;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;2. Funciones recursivas para recorrer todos los folders y crearlos en el destino así como los items por folder:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;public static void CopyFoldersAndItems(SPDocumentLibrary origen, SPDocumentLibrary destino)&lt;br /&gt;{&lt;br /&gt;if (origen == null  destino == null) throw new ArgumentException("Las bibliotecas destino y origen no pueden ser nulas");&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;string urldestinofolders = destino.RootFolder.ServerRelativeUrl.ToString();&lt;br /&gt;SPFolderCollection foldersdestino = destino.ParentWeb.GetFolder(urldestinofolders).SubFolders;&lt;br /&gt;string urlorigenfolders = origen.RootFolder.ServerRelativeUrl.ToString();&lt;br /&gt;SPFolderCollection foldersorigen = origen.ParentWeb.GetFolder(urlorigenfolders).SubFolders;&lt;br /&gt;foreach (SPFile file in origen.RootFolder.Files)&lt;br /&gt;{&lt;br /&gt;SPFile newFile = destino.RootFolder.Files.Add(file.Name, file.OpenBinary(), file.Author, file.ModifiedBy, file.TimeCreated, file.TimeLastModified);&lt;br /&gt;SPListItem newItem = newFile.Item;&lt;br /&gt;foreach (SPField f in file.Item.Fields)&lt;br /&gt;{&lt;br /&gt;if (!f.ReadOnlyField) newItem[f.InternalName] = file.Item[f.InternalName];&lt;br /&gt;}&lt;br /&gt;newItem["Modificado"] = file.TimeLastModified;&lt;br /&gt;newItem["Creado"] = file.TimeCreated;&lt;br /&gt;newItem.UpdateOverwriteVersion();&lt;br /&gt;}&lt;br /&gt;CopyFoldersAndItems(foldersorigen, foldersdestino);&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;throw ex;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;public static void CopyFoldersAndItems(SPFolderCollection origen, SPFolderCollection destino)&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;foreach (SPFolder folder in origen)&lt;br /&gt;{&lt;br /&gt;if (folder.Name != "Forms")&lt;br /&gt;{&lt;br /&gt;SPFolder nuevo = destino.Add(folder.Name);&lt;br /&gt;foreach (SPFile file in folder.Files)&lt;br /&gt;{&lt;br /&gt;SPFile newFile = nuevo.Files.Add(file.Name, file.OpenBinary(), file.Author, file.ModifiedBy, file.TimeCreated, file.TimeLastModified);&lt;br /&gt;SPListItem newItem = newFile.Item;&lt;br /&gt;foreach (SPField f in file.Item.Fields)&lt;br /&gt;{&lt;br /&gt;if(!f.ReadOnlyField) newItem[f.InternalName] = file.Item[f.InternalName];&lt;br /&gt;}&lt;br /&gt;newItem["Modificado"] = file.TimeLastModified;&lt;br /&gt;newItem["Creado"] = file.TimeCreated;&lt;br /&gt;newItem.UpdateOverwriteVersion();&lt;br /&gt;}&lt;br /&gt;if (folder.SubFolders.Count &gt; 0) CopyFoldersAndItems(folder.SubFolders, nuevo.SubFolders);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;throw ex;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-2116711880537237381?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/2116711880537237381/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=2116711880537237381' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2116711880537237381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2116711880537237381'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/02/copiar-items-y-folders-entre.html' title='Copiar items y folders entre DocumentLibrary manteniendo sus campos'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-3561113923173835333</id><published>2009-02-02T08:59:00.000-08:00</published><updated>2010-09-21T02:45:05.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Obtener webparts de una página (MOSS 2007)</title><content type='html'>&lt;p&gt;Aquí tenemos un ejemplo para obtener las webparts de una página de publicación,&lt;br /&gt;una vez tenemos el tipo de la webpart podemos hacer un casting y acceder a sus propiedades para consultarlas y/o modificarlas.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.WebPartPages;&lt;br /&gt;&lt;br /&gt;namespace ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            using(SPSite siteCollection = new SPSite("http://localhost:44236"))&lt;br /&gt;            {&lt;br /&gt;                using(SPWeb site = siteCollection.OpenWeb())&lt;br /&gt;                {&lt;br /&gt;                    using (SPLimitedWebPartManager manager = site.GetLimitedWebPartManager("Paginas/default.aspx", PersonalizationScope.Shared))&lt;br /&gt;                    {&lt;br /&gt;                        foreach (System.Web.UI.WebControls.WebParts.WebPart wp in manager.WebParts)&lt;br /&gt;                        {&lt;br /&gt;                            Console.WriteLine(wp.GetType().ToString());&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.ReadLine();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-3561113923173835333?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/3561113923173835333/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=3561113923173835333' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3561113923173835333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/3561113923173835333'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/02/obtener-webparts-de-una-pagina-moss.html' title='Obtener webparts de una página (MOSS 2007)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7011206115905062779</id><published>2009-02-02T05:55:00.000-08:00</published><updated>2010-09-21T02:47:01.401-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Añadir link abra el panel de control en una webpart</title><content type='html'>Si nuestra webpart necesita tener configuradas ciertas propiedades podemos mostrar un link que abra el panel de control (toolpane) hasta que estas propiedades no estén configuradas. Para ello tenemos que distinguir entre dos casos: webparts que derivan de Microsoft.SharePoint.WebParts.Webpart o webparts que derivan de System.Web.UI.WebControls.WebParts.Webpart.&lt;br /&gt;&lt;br /&gt;En el primer caso tenemos una función, ToolPane.GetShowExtensibleToolPaneEvent, que pasándole el id de nuestra webpart nos devuelve un string con la llamada javascritpt que queremos realizar, por lo que el código quedaría algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;public class WPPrueba : Microsoft.SharePoint.WebPartPages.WebPart&lt;br /&gt;{&lt;br /&gt;#region Variables&lt;br /&gt;private string _propiedad;&lt;br /&gt;#endregion&lt;br /&gt;#region Propieades&lt;br /&gt;[Browsable(true),&lt;br /&gt;Category("Mis Propiedades"),&lt;br /&gt;DefaultValue(""),&lt;br /&gt;WebPartStorage(Storage.Shared),&lt;br /&gt;FriendlyName("Propiedad"),&lt;br /&gt;Description("Propiedad.")]&lt;br /&gt;public string Propiedad&lt;br /&gt;{&lt;br /&gt;get { return _propiedad; }&lt;br /&gt;set { _propiedad = value; }&lt;br /&gt;}&lt;br /&gt;protected override void Render(HtmlTextWriter writer)&lt;br /&gt;{&lt;br /&gt;base.Render(writer);&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;if (Propiedad == null Propiedad == "")&lt;br /&gt;{&lt;br /&gt;string funcionJavaScript = ToolPane.GetShowExtensibleToolPaneEvent(this.ID);&lt;br /&gt;string html = "&lt;a href="http://www.blogger.com/"&gt;abra el panel de herramientas&lt;/a&gt;";&lt;br /&gt;writer.Write(html);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;writer.Write("hello world");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch(Exception ex)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;#endregion&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;En el segundo caso no podemos hacer esto por lo que añadiremos el código javascript a mano:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: jscript"&gt;&lt;br /&gt;&lt;br /&gt;string html = " &lt;a href="http://www.blogger.com/"&gt;abra el panel de herramientas&lt;/a&gt;";&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7011206115905062779?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7011206115905062779/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7011206115905062779' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7011206115905062779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7011206115905062779'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/02/anadir-link-abra-el-panel-de-control-en.html' title='Añadir link abra el panel de control en una webpart'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-560102649107772084</id><published>2009-01-31T07:18:00.000-08:00</published><updated>2009-01-31T07:28:53.240-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certificaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>MCPD Web Developer</title><content type='html'>El próximo viernes rendiré el examen que me puede acreditar como MCPD (Microsoft Certified Professional Developer): Web Developer. Este exámen es el 70-547: PRO: Designing and Developing Web Applications by Using the Microsoft .NET Framework.&lt;br /&gt;&lt;br /&gt;Para preparar esta certificación he estado leyendo el libro: MCPD Self-Paced Training Trainink Kit (Exam 70-547), este libro contiene los siguientes capítulos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 1: Application Requirements and Design&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 2: Decompose Specifications for Developers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 3: Design Evaluation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 4: Creating a User Interface&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 5: Creating and Choosing Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 6: Data Validation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 7: Delivering Multimedia&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 8: Component Design&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 9: Component Development&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 10: Reusable Software Components&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 11: Application Logic Layer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 12: Logging and Monitoring&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 13: Application Configuration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 14: Define and Evaluate a Testing Strategy&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 15: Creating Development Tests&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 16: Deploying an Application&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;Chapter 17: Supporting an Application&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Para más información:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/learning/mcp/mcpd/webdev/default.mspx"&gt;http://www.microsoft.com/learning/mcp/mcpd/webdev/default.mspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-560102649107772084?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/560102649107772084/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=560102649107772084' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/560102649107772084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/560102649107772084'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/01/mcpd-web-developer.html' title='MCPD Web Developer'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-825367098195975134</id><published>2009-01-30T04:13:00.000-08:00</published><updated>2009-01-30T04:24:18.886-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='WSS'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Logger to SharePoint Logs</title><content type='html'>Hola actualmente hemos creada una pequeña utilidad que nos permite serializar los logs utilizando el mismo sistema que utilidad Windows SharePoint Services. Lo que hemos hecho es crear una clase TraceProvider igual que nos indican en las MSDN:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa979522.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa979522.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Luego hemos creado una classe estática logger con un conjunto de métodos estáticos que nos facilitan a la hora de guardar los logs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3366ff;"&gt;public static class Logger&lt;br /&gt;{&lt;br /&gt;public static void LogUnassigned(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Unassigned, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogCriticalEvent(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.CriticalEvent, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogWarningEvent(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.WarningEvent, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogInformationEvent(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.InformationEvent, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogException(Exception e)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Exception, e.Source, e.TargetSite.ToString(), e.ToString());&lt;br /&gt;}&lt;br /&gt;public static void LogAssert(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Assert, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogUnexpected(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Unexpected, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogMonitorable(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Monitorable, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogHigh(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.High, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void LogMedium(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Medium, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;public static void LogVerbose(string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;Log(TraceProvider.TraceSeverity.Verbose, ProductName, Title, Message);&lt;br /&gt;}&lt;br /&gt;private static void Log(TraceProvider.TraceSeverity type, string ProductName, string Title, string Message)&lt;br /&gt;{&lt;br /&gt;TraceProvider.RegisterTraceProvider();&lt;br /&gt;TraceProvider.WriteTrace(0, type, Guid.NewGuid(), ProductName, ProductName, Title, Message);&lt;br /&gt;TraceProvider.UnregisterTraceProvider();&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-825367098195975134?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/825367098195975134/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=825367098195975134' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/825367098195975134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/825367098195975134'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/01/logger-to-sharepoint-logs.html' title='Logger to SharePoint Logs'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-374940526111744866</id><published>2009-01-29T11:40:00.000-08:00</published><updated>2009-01-29T11:48:09.487-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Navegación fuera de contexto en sharepoint (moss 2007)</title><content type='html'>Una forma de recorrer una jerarquia de sites de publicación en MOSS 2007 desde fuera del contexto web (es decir desde una aplicación de consola, aplicación windows, etc. ) seria utilizando las propiedades CurrentNavigationNodes y GlobalNavigationNodes de la clase PublishingWeb.&lt;br /&gt;&lt;br /&gt;De esta forma podemos obtener la navegación de los usuarios respetando cosas como pueden ser el orden que se ha establecido o si queremos mostrar subsites, páginas, etc.&lt;br /&gt;&lt;br /&gt;Aquí añado un poco de código donde se muestran un uso de estas propiedades:&lt;br /&gt;&lt;br /&gt;NOTA: Es necesario referencial la dll Microsoft.SharePoint.Publishing.dll&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.Publishing;&lt;br /&gt;using Microsoft.SharePoint.Navigation;&lt;br /&gt;namespace ConsoleApplication2&lt;br /&gt;{&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;using (SPSite siteCollection = new SPSite("http://localhost"))&lt;br /&gt;{&lt;br /&gt;using (SPWeb site = siteCollection.OpenWeb())&lt;br /&gt;{&lt;br /&gt;PublishingWeb pw = PublishingWeb.GetPublishingWeb(site);&lt;br /&gt;Console.WriteLine("Navegación actual de la site Nombre: {0}, Url: {1} ",site.Title,site.Url);&lt;br /&gt;foreach (SPNavigationNode nodo in pw.CurrentNavigationNodes)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Titulo: {0}, Url: {1}", nodo.Title, nodo.Url);&lt;br /&gt;}&lt;br /&gt;Console.WriteLine("Navegación global de la site Nombre: {0}, Url: {1} ", site.Title, site.Url);&lt;br /&gt;foreach (SPNavigationNode nodo in pw.GlobalNavigationNodes)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Titulo: {0}, Url: {1}", nodo.Title, nodo.Url);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(ex.ToString());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-374940526111744866?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/374940526111744866/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=374940526111744866' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/374940526111744866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/374940526111744866'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/01/navegacion-fuera-de-contexto-en.html' title='Navegación fuera de contexto en sharepoint (moss 2007)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-4370167393093419878</id><published>2009-01-28T06:17:00.001-08:00</published><updated>2010-10-17T23:52:30.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Acceder al QueryString con JavaScript</title><content type='html'>Este post lo hago simplemente para recordarlo, que siempre se me olvida y me vuelvo loco buscando un ejemplo:  &lt;br /&gt;  &lt;br /&gt;  &lt;pre class="brush: js;"&gt;//Devuelve un array con la coleccion de parametros del queryString&lt;br /&gt;function queryString() { &lt;br /&gt;&lt;br /&gt;    var qsParm = new Array(); &lt;br /&gt;    var query = window.location.search.substring(1); &lt;br /&gt;    var parms = query.split('&amp;amp;'); &lt;br /&gt;&lt;br /&gt;    for (var i=0; i&amp;lt;parms.length; i++) {&lt;br /&gt;    &lt;br /&gt;        var pos = parms[i].indexOf('='); &lt;br /&gt;        &lt;br /&gt;        if (pos &amp;gt; 0) { &lt;br /&gt;        &lt;br /&gt;            var key = parms[i].substring(0,pos); &lt;br /&gt;            var val = parms[i].substring(pos+1); &lt;br /&gt;            qsParm[key] = val; &lt;br /&gt;            &lt;br /&gt;        } &lt;br /&gt;    } &lt;br /&gt;    &lt;br /&gt;    return qsParm;&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-4370167393093419878?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/4370167393093419878/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=4370167393093419878' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/4370167393093419878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/4370167393093419878'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/01/acceder-al-querystring-con-javascript.html' title='Acceder al QueryString con JavaScript'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-1514308021268750852</id><published>2009-01-28T04:13:00.000-08:00</published><updated>2009-01-28T04:20:02.888-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>ConnectionString en SharePoint (MOSS 2007)</title><content type='html'>La cadena de conexión para la base de datos de configuración es persistida en una clave de registro, consultando la clave específica podemos obtener la cadena de conexión.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;1. Inicio --&gt; Ejecutar: regedit&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;2. Navega por: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Secure\configdb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Trozo de código para obtenerla:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Secure\configdb");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;DSN = (string) key.GetValue("DSN");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;SQLServerInstance = new string[]{this.DSN.Split(new char[] { '=', ';' })[1]};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3366ff;"&gt;key.Close();&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-1514308021268750852?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/1514308021268750852/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=1514308021268750852' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1514308021268750852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/1514308021268750852'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/01/connectionstring-en-sharepoint-moss.html' title='ConnectionString en SharePoint (MOSS 2007)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-2590185334887814632</id><published>2009-01-28T03:05:00.000-08:00</published><updated>2009-01-28T03:41:40.399-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Deshabilitar Mi Sitio y Mis vínculos en SharePoint (MOSS 2007)</title><content type='html'>Para poder configurar quien puede ver Mi Sitio y Mis Vínculos en Microsoft Office SharePoint Server 2007 tendremos que seguir los siguientes pasos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;1. Ir a la Administración Central&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;2. In a la Administración de los Servicios Compartidos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;3. Permisos de servicios de personalización&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;4. Agregarmos el grupo al que queremos dar permisos para crear sitios personales y marcamos los checkbox:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;- Crear un sitio personal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;- Utilizar características personales&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#3333ff;"&gt;5. Eliminamos el grupo NTAuthority\Authenticated Users que es el que viene por defecto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De esta forma ya habremos limitado esta características a un grupo de directorio activo particular.&lt;br /&gt;&lt;br /&gt;Si lo que queremos es simpelemente que ningún usuario vea estos links lo que podemos hacer es desactivar la feature que nos muestra estos links, en la master.page tenemos un sharepoint delegate control que se complementa con un user control a partir de una feature que está activada en el ámbito de toda la granja de servidores. Para deshabilitar esta feature:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;C:\Program Files\Microsoft Shared\web server extensions\12\bin\&gt;stsadm -o deactivatefeature -name MySite&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Información extraida de:&lt;br /&gt;&lt;a href="http://geekswithblogs.net/RogueCoder/archive/2006/11/01/95766.aspx"&gt;http://geekswithblogs.net/RogueCoder/archive/2006/11/01/95766.aspx&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-2590185334887814632?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/2590185334887814632/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=2590185334887814632' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2590185334887814632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/2590185334887814632'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2009/01/deshabilitar-mi-sitio-y-mis-vinculos-en.html' title='Deshabilitar Mi Sitio y Mis vínculos en SharePoint (MOSS 2007)'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137424020219368372.post-7624555242119817102</id><published>2008-01-27T11:19:00.000-08:00</published><updated>2009-01-28T03:00:55.571-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certificaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Preparando Certificaciones en WSS 3.0 y MOSS 2007</title><content type='html'>-&lt;strong&gt; MCTS: Windows SharePoint Services 3.0 - Configuration&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Exam: 70-631&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Course: 5060&lt;/span&gt; - Implementing Microsoft Windows SharePoint Server 3.0&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 1: Introduction to the Windows SharePoint Services 3.0 Platform&lt;br /&gt;Module 2: Planning the Windows SharePoint Services 3.0 Environment&lt;br /&gt;Module 3: Installing Windows SharePoint Services 3.0&lt;br /&gt;Module 4: Upgrading from Windows SharePoint Services 2.0 to 3.0&lt;br /&gt;Module 5: Managing Windows Windows SharePoint Services 3.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Más información en: &lt;a href="http://www.microsoft.com/learning/mcp/mcts/spservices/config/default.mspx"&gt;http://www.microsoft.com/learning/mcp/mcts/spservices/config/default.mspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;- MCTS: Microsoft Office SharePoint Server 2007 - Configuration&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Exam: 70-630&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Course: 5061&lt;/span&gt; - Implementing Micorosft Office SharePoint Server 2007&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 1: Overview of Microsoft Office SharePoint Server 2007&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 2: Planning and Designing for Microsoft Office SharePoint Server 2007&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 3: Deploying Microsoft Office SharePoint Server 2007&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 4: Administering Microsoft Office SharePoint Server 2007&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 5: Implementing Portal Solutions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 6: Implementing Content Management Solutions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 7: Implementing Business Intelligence Solutions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 8: Implementing Search and Indexing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Module 9: Maintaining and Optimizing Microsoft Office SharePoint Server 2007&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Más información en: &lt;a href="http://www.microsoft.com/learning/mcp/mcts/spserver/config/default.mspx"&gt;http://www.microsoft.com/learning/mcp/mcts/spserver/config/default.mspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;- MCTS: Windows SharePoint Services 3.0 - Application Development&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Exam: 70-541&lt;/span&gt;&lt;br /&gt;Book - Inside Microsoft Windows SharePoint Services Version 3.0&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 1: Getting Started&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 2: SharePoint Architecture&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 3: Pages and Design&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 4: Web Parts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 5: AJAX Web Parts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 6: Lists and Content Types&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 7: Document Libraries&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 8: SharePoint Workflows&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 9: Solutions and Deployment&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 10: Application Security&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Más información en: &lt;/span&gt;&lt;a href="http://www.microsoft.com/MSPress/books/9692.aspx"&gt;&lt;span style="font-size:85%;"&gt;http://www.microsoft.com/MSPress/books/9692.aspx&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- MCTS: Microsoft Office SharePoint Server 2007 - Application Development&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Exam: 70-542&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Book - Inside Microsoft Office SharePoint Server 2007&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Chapter 1: Introducing Microsoft Office SharePoint Server 2007&lt;br /&gt;Chapter 2: Collaboration Portals and People Management&lt;br /&gt;Chapter 3: Customizing and Extending the Microsoft Office SharePoint 2007 Search&lt;br /&gt;Chapter 4: Working with the Business Data Catalog&lt;br /&gt;Chapter 5: Infopath Forms Services&lt;br /&gt;Chapter 6: Customizing and Branding Publishing Portals&lt;br /&gt;Chapter 7: Integrating with Excel Services&lt;br /&gt;Chapter 8: Policies and the Records Repository&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Más información en: &lt;a href="http://www.microsoft.com/MSPress/books/10472.aspx"&gt;http://www.microsoft.com/MSPress/books/10472.aspx&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137424020219368372-7624555242119817102?l=jordiruiznet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jordiruiznet.blogspot.com/feeds/7624555242119817102/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=137424020219368372&amp;postID=7624555242119817102' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7624555242119817102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137424020219368372/posts/default/7624555242119817102'/><link rel='alternate' type='text/html' href='http://jordiruiznet.blogspot.com/2008/01/preparando-certificaciones-en-wss-30-y.html' title='Preparando Certificaciones en WSS 3.0 y MOSS 2007'/><author><name>Jordi Ruiz</name><uri>http://www.blogger.com/profile/05148524426205578352</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Pr5OkOx_Vdo/SY8ElPKOERI/AAAAAAAAACE/DT8qcrIPDok/S220/n1470857446_30067629_4016.jpg'/></author><thr:total>1</thr:total></entry></feed>
