<?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-1007425235891530702</id><updated>2012-02-16T00:31:03.070-08:00</updated><category term='.xls'/><category term='Pipeline'/><category term='Logging Biztalk'/><category term='IDOC'/><category term='Persistence Service'/><category term='SOAPException'/><category term='Asp.Net'/><category term='Encriptacion'/><category term='GridView'/><category term='Web.config'/><category term='ConnectionStrings'/><category term='Adaptadores WCF'/><category term='Custom Exception'/><category term='Encrypt'/><category term='C #'/><category term='Log'/><category term='Loggin'/><category term='RSA'/><category term='Suspend Acitvity'/><category term='State Machine'/><category term='WCF'/><category term='Users Active Directory'/><category term='WebService Exception'/><category term='Active Directory'/><category term='Bindings'/><category term='Biztalk'/><category term='DPAPI'/><category term='Decrypt'/><category term='Multiples IDOC'/><category term='Get Information Active Directory'/><category term='SOAP Excepction'/><category term='Workflow Foundation'/><category term='C Sharp'/><category term='Biztalk R2'/><category term='Excel'/><title type='text'>.Net, Biztalk, y lo que venga...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-9116685097429621544</id><published>2008-12-25T17:30:00.000-08:00</published><updated>2008-12-26T09:51:46.727-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bindings'/><category scheme='http://www.blogger.com/atom/ns#' term='Adaptadores WCF'/><category scheme='http://www.blogger.com/atom/ns#' term='Biztalk R2'/><category scheme='http://www.blogger.com/atom/ns#' term='Biztalk'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Introduccion a conectores de BizTalk R2  para WCF</title><content type='html'>Hace algún tiempo vengo trabajando con las nuevos adaptadores de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;WCF&lt;/span&gt; que vienen incluidos en la versión R2 de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;BizTalk&lt;/span&gt; 2006, y la idea de este post es solo dar una pequeña introducción a lo que me toca utilizar de todo este conjunto de nuevas herramientas y en algunos post posteriores iré publicando como consumir desde &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;BiztTalk&lt;/span&gt; servicios publicados con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;WCF&lt;/span&gt; y las distintas opciones para esto.&lt;br /&gt;Como la mayoría de los que puedan leer este post sabrán, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;WCF&lt;/span&gt; ofrece un rango bastante amplio de posibilidades a cerca de las opciones de cómo consumir un servicio &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;WCF&lt;/span&gt; publicado, estas opciones o “&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;bindings&lt;/span&gt;” varían tanto en el tipo de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;transporte&lt;/span&gt; y configuraciones de seguridad, pero en general las opciones serian las de la siguiente tabla:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 370px; CURSOR: hand; HEIGHT: 719px; TEXT-ALIGN: center" alt="" src="http://img132.imageshack.us/img132/1360/tablazl4.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Comenzar con un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Send&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Port&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Basico&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Comenzaremos creando un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Send&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Port&lt;/span&gt; que utiliza el adaptador &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;WSHttpBinding&lt;/span&gt;. En este primer paso nuestro objetivo seria integrarse &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;endpoint&lt;/span&gt; que se se construye por defecto al crear un servicio &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;WCF&lt;/span&gt; en Visual &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Studio&lt;/span&gt; 2008.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Lo primero que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;deberíamos&lt;/span&gt; hacer es asegurarnos que el servicio este levantado y la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;configuración&lt;/span&gt; de su &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;binding&lt;/span&gt; se corresponda con el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;Send&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Port&lt;/span&gt; que estamos creando, esto seria simplemente poner la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;URL&lt;/span&gt; en un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;IExplorer&lt;/span&gt;, verificar que el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;WSDL&lt;/span&gt; del servicio se muestra correctamente y &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;además&lt;/span&gt; el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;binding&lt;/span&gt; del servicio expuesto como se muestra en la imagen&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 998px; CURSOR: hand; HEIGHT: 589px; TEXT-ALIGN: center" alt="" src="http://img88.imageshack.us/img88/574/wsdlqc3.jpg" border="0" /&gt;&lt;br /&gt;Realizados esto pasos tendremos que seleccionar el adaptador y luego podemos hacer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;click&lt;/span&gt; "Configure" para configurar como el adaptador &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;WSHttpBinding&lt;/span&gt; como debería ser usado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 649px; CURSOR: hand; HEIGHT: 514px; TEXT-ALIGN: center" alt="" src="http://img386.imageshack.us/img386/4149/sendport1iv3.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Donde los datos que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_29"&gt;deberemos&lt;/span&gt; completar este tipo de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;Send&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;Port&lt;/span&gt; son realmente muy pocos, por un lado la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;URL&lt;/span&gt; del servicio, por el otro la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;Soap&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;Action&lt;/span&gt; del &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;methodo&lt;/span&gt; que queremos consumir en este &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;Send&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;Port&lt;/span&gt; y cuyo "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;wsdl&lt;/span&gt;:&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;operation&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;name&lt;/span&gt;" &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_41"&gt;coincide&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_42"&gt;también&lt;/span&gt; con la &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_43"&gt;operación&lt;/span&gt; de del servicio que queremos instanciar. (esto es &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_44"&gt;básicamente&lt;/span&gt; copiar del &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;WSDL&lt;/span&gt; al &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;TextBox&lt;/span&gt;: &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;Action&lt;/span&gt; como se muestra a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_48"&gt;continuación&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Muestra del &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;WSDL&lt;/span&gt; del servicio:&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 659px; CURSOR: hand; HEIGHT: 182px; TEXT-ALIGN: center" alt="" src="http://img88.imageshack.us/img88/1952/sendport3by5.jpg" border="0" /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;Configuración&lt;/span&gt; del puerto para consumir la &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_51"&gt;operación&lt;/span&gt; del &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;WSDL&lt;/span&gt; marcado arriba:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 430px; CURSOR: hand; HEIGHT: 593px; TEXT-ALIGN: center" alt="" src="http://img88.imageshack.us/img88/4350/sendport2pn6.jpg" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Eso seria todo por ahora, en &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_53"&gt;próximos&lt;/span&gt; post prometo mostrar como consumir servicios con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;Custom&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;Binding&lt;/span&gt;, que por cierto son bastante mas complejos de consumir y configurar.&lt;/p&gt;&lt;p&gt;Espero que pueda servirles.&lt;/p&gt;&lt;p&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;Ariel&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;Serlin&lt;/span&gt;&lt;br /&gt;&lt;/p&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/1007425235891530702-9116685097429621544?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/9116685097429621544/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=9116685097429621544' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/9116685097429621544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/9116685097429621544'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/12/introduccion-conectores-de-biztalk-r2-y.html' title='Introduccion a conectores de BizTalk R2  para WCF'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-1935118094564381170</id><published>2008-12-23T10:58:00.000-08:00</published><updated>2008-12-25T15:43:17.498-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.xls'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><category scheme='http://www.blogger.com/atom/ns#' term='C #'/><title type='text'>Cargar hoja de Excel (.xls) en GridView de Asp.Net</title><content type='html'>Algo que a menudo sucede, es que nuestros usuarios pueden tener "bases de datos" enteras en sus computadores en formato Excel y por alguna cuestión que desconozco repentinamente quieren comenzar a utilizarlas dentro de un determinado sistema como una fuente de datos para no tener que cargar todo de nuevo.&lt;br /&gt;&lt;br /&gt;Una posible aproximación a solucionar este problema es la que trato de mostrar acá, que básicamente seria importar una hoja de MS Excel a un GridView de Asp.Net, una vez cargada en nuestra grilla, poder darles la posibilidad a nuestros usuarios de corregir algún dato. Finalmente quedaría recorrer la grilla y guardar estos datos en nuestra DB o procesarlos de alguna otra manera (si alguien tiene problema con esta ultima cuestión por favor no dude en escribir). También es válido aclarar que en el ejemplo asumo de antemano que conocemos la estructura del Excel que pretende bindearse al nuestro GridView.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Yendo directamente el punto, la idea en es poder utilizar al motor de consultas JET 4.0, de la misma manera en la que lo utilizaríamos para consultar cualquier otra fuente de datos (una base de datos de MS Acces por ejemplo).&lt;/p&gt;Les copio el código, que me parece que habla por sí solo y más abajo un link con una solución de prueba en la que dejo también incluido un archivo de Excel con el que se podrá probar la solución, solo deberán seleccionar el archivo y luego darle un click al botón importar.&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 500px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#000000;"&gt;btnImportarNomina_Click(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; &lt;span style="color:#000000;"&gt;sender, EventArgs e)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#000000;"&gt;(nominaExcel.PostedFile != &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;            List&amp;lt;Lista&amp;gt; listaCollection = new List&amp;lt;Lista&amp;gt;();&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;         &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;             &lt;span style="color:#3333ff;"&gt;StringBuilder&lt;/span&gt; sbConnection = new &lt;span style="color:#3333ff;"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                sbConnection.Append("&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&lt;/span&gt;&lt;span style="color:#000000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#000000;"&gt;(nominaExcel.PostedFile.FileName.Contains(".xls"))&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    sbConnection.Append(nominaExcel.PostedFile.FileName);&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;sbConnection.Append(";&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Extended Properties=Excel 8.0;Persist Security Info=False&lt;/span&gt;&lt;span style="color:#000000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;System.Data.OleDb.OleDbConnection SQLCon = new System.Data.OleDb.OleDbConnection(sbConnection.ToString());&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    System.Data.OleDb.OleDbCommand SQLCom = new System.Data.OleDb.OleDbCommand("select * from [Hoja1$]", SQLCon);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    System.Data.OleDb.OleDbDataAdapter SQLDa = new System.Data.OleDb.OleDbDataAdapter(SQLCom);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                 &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    SQLCon.Open();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    IDataReader Odbreader = SQLCom.ExecuteReader();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    listaCollection.Clear();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(Odbreader.Read())&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                       &lt;span style="color:#000000;"&gt; Lista lista&lt;/span&gt;&lt;span style="color:#000000;"&gt; =&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;Lista();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(Odbreader[0].ToString()))&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                        &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                            lista.NumeroDocumento = Convert.ToInt32(Odbreader[0]);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                            lista.Nombre = Odbreader[1].ToString();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                            lista.FechaNac = Convert.ToDateTime(Odbreader[2]);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                            listaCollection.Add(lista);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                        }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    SQLCon.Close();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    GridView1.DataSource = listaCollection;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                    GridView1.DataBind();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ariel Serlin&lt;br /&gt;&lt;br /&gt;Para bajar el codigo hace click aqui&lt;br /&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b311130212b6846e.skydrive.live.com/embedrow.aspx/P%c3%bablico/XLSToGrid.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1007425235891530702-1935118094564381170?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/1935118094564381170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=1935118094564381170' title='13 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/1935118094564381170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/1935118094564381170'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/12/cargar-hoja-de-excel-xls-en-gridview-de.html' title='Cargar hoja de Excel (.xls) en GridView de Asp.Net'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-8600838808438738281</id><published>2008-12-21T16:27:00.000-08:00</published><updated>2008-12-21T18:02:40.053-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Get Information Active Directory'/><category scheme='http://www.blogger.com/atom/ns#' term='C Sharp'/><category scheme='http://www.blogger.com/atom/ns#' term='Users Active Directory'/><category scheme='http://www.blogger.com/atom/ns#' term='C #'/><category scheme='http://www.blogger.com/atom/ns#' term='Active Directory'/><title type='text'>Consultar usuarios de Active Directory desde C#</title><content type='html'>Algo que puede resultar muy útil en algunos casos es tener que consultar información de los usuarios de la red dados de alta en Active Directory desde nuestra aplicacion, en este caso con C#.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para comenzar deberemos tener en cuenta que es necesario poder contar con un usuario dado de alta en Active Directory, aunque con mínimos permisos. Este usuario con el que deberemos contar sera el usuario que se conecte a nuestro Active Directory(en el caso del código este ejemplo debería agregarse su información en nuestro web.config). Y servirá para el caso en el que querramos obtener por ejemplo el correo electrónico, nombre, apellido, o algún otro dato de cualquier usuario, solo teniendo su loguin por ejemplo.&lt;br /&gt;&lt;br /&gt;Yendo puntualmente a la solución de nuestro problema, lo primero que deberemos hacer en nuestro proyecto es referenciar al assembly System.DirectoryServices, posteriormente deberemos hacer un using de la misma&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5282409805073543874" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 161px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_EBB616fU4n0/SU7juvVy8sI/AAAAAAAAADQ/q2WRnEiU1AU/s200/reference.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Así de simple podremos consultar la información de nuestros usuario de la siguiente manera&lt;/p&gt;&lt;p&gt;&lt;/p&gt;Si bien el código que sigue no tiene grandes complicaciones, básicamente consta de dos clases (en el mismo archivo ), que para el caso de la primero solo modela un usuario con sus propiedades y la segunda contiene un método con el comportamiento necesario para conectarse a nuestro AD, a través del usuario configurado en algún archivo de configuracion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 500px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#000000;"&gt;System;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#000000;"&gt;System.Collections.Generic;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#000000;"&gt;System.Text;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#000000;"&gt;System.Configuration;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#000000;"&gt;System.DirectoryServices;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; &lt;span style="color:#000000;"&gt;FindUSers&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#000000;"&gt;Usuarios&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; id_User;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; &lt;span style="color:#000000;"&gt;Id_User&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; &lt;span style="color:#000000;"&gt;{&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;id_User; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ id_User =&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;login;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;Login&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; login; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ login = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;password;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;Password&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;password; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ password =&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;email;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;Email&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; &lt;span style="color:#000000;"&gt;{&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;email; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ email =&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;lastName;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;LastName&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;lastName; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ lastName =&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;names;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;Names&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; &lt;span style="color:#000000;"&gt;{&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;names; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ names =&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;  &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#000000;"&gt;GetUsersInfo&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&amp;lt;Usuarios&amp;gt; FindName(&lt;/span&gt;&lt;span style="color:#9999ff;"&gt;Usuarios&lt;/span&gt; &lt;span style="color:#000000;"&gt;usuario)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;//This info can become from web.config&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;         &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;userAD = ConfigurationSettings.AppSettings["UserAD"];&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;passAD = ConfigurationSettings.AppSettings["PassAD"];&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;ldap = "LDAP://" + ConfigurationSettings.AppSettings["LDAP"];&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;strSearchAD = "";&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#000000;"&gt;(usuario.Email != "")&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#000000;"&gt; strSearchAD = "(&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;mail=&lt;/span&gt;&lt;span style="color:#000000;"&gt;" + usuario.Email.ToLower() + ")";&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (usuario.LastName != "")&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#000000;"&gt; strSearchAD += "(&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;sn=&lt;/span&gt;&lt;span style="color:#000000;"&gt;" + usuario.LastName + ")";&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#000000;"&gt;(usuario.Login != "")&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;               &lt;span style="color:#000000;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;strSearchAD += "(&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;sAMAccountName=&lt;/span&gt;&lt;span style="color:#000000;"&gt;" + usuario.Login + ")";&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;List&amp;lt;Usuarios&amp;gt; listUsuarios = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;List&amp;lt;Usuarios&amp;gt;();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#008000;"&gt;//DirectoryEntry adEntry = new DirectoryEntry("LDAP://Domaincontroler", "user", "pass", AuthenticationTypes.Secure);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;DirectoryEntry adEntry = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;DirectoryEntry(ldap, userAD, passAD, AuthenticationTypes.Secure);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;System.DirectoryServices.DirectorySearcher adSearch = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;System.DirectoryServices.DirectorySearcher(adEntry);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;            &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;adSearch.Filter = "&lt;/span&gt;&lt;span style="color:#993300;"&gt;(&amp;amp;(objectClass=user)&lt;/span&gt;&lt;span style="color:#000000;"&gt;" + strSearchAD +&lt;/span&gt; &lt;span style="color:#000000;"&gt;")";&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                SearchResultCollection objResultados;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#008000;"&gt;//adResult = adSearch.FindOne(); // if only i need the first returned user &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;objResultados = adSearch.FindAll();&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; &lt;span style="color:#000000;"&gt;(SearchResult MiObjeto&lt;/span&gt; &lt;span style="color:#000000;"&gt;in objResultados)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;               &lt;span style="color:#000000;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                   &lt;span style="color:#000000;"&gt; Usuarios usarioToAdd =&lt;/span&gt; &lt;span style="color:#3333ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;Usuarios();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;usarioToAdd.Email = MiObjeto.Properties["&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;mail&lt;/span&gt;&lt;span style="color:#000000;"&gt;"][0].ToString();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;usarioToAdd.Login = MiObjeto.Properties["&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;sAMAccountName&lt;/span&gt;&lt;span style="color:#000000;"&gt;"][0].ToString();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;usarioToAdd.Names = MiObjeto.Properties["&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;givenName&lt;/span&gt;&lt;span style="color:#000000;"&gt;"][0].ToString();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;usarioToAdd.LastName = MiObjeto.Properties["&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;sn&lt;/span&gt;&lt;span style="color:#000000;"&gt;"][0].ToString();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                    &lt;span style="color:#000000;"&gt;listUsuarios.Add(usarioToAdd);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;listUsuarios;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;       &lt;span style="color:#000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;    &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;Adjunto el código correspondiente al proyecto en el que se encuentra el archio .cs con las dos clases del ejemplo (recuerden agregar un archivo .config con las entradas necesarias ), espero que sirva.&lt;br /&gt;&lt;br /&gt;Ariel Serlin&lt;br /&gt;&lt;br /&gt;Para bajar el codigo hace click aqui&lt;br /&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b311130212b6846e.skydrive.live.com/embedrow.aspx/P%c3%bablico/ActiveDirectory.rar" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1007425235891530702-8600838808438738281?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/8600838808438738281/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=8600838808438738281' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/8600838808438738281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/8600838808438738281'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/12/consultar-usuarios-de-active-directory.html' title='Consultar usuarios de Active Directory desde C#'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EBB616fU4n0/SU7juvVy8sI/AAAAAAAAADQ/q2WRnEiU1AU/s72-c/reference.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-261824703877602603</id><published>2008-12-04T06:47:00.000-08:00</published><updated>2008-12-21T16:17:08.801-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multiples IDOC'/><category scheme='http://www.blogger.com/atom/ns#' term='Pipeline'/><category scheme='http://www.blogger.com/atom/ns#' term='IDOC'/><category scheme='http://www.blogger.com/atom/ns#' term='Biztalk'/><title type='text'>Suscribirse a multiples IDOCs en una misma ReceiveLocation ( Biztalk )</title><content type='html'>Tuve un asunto hace poco en mi trabajo en la que necesitaba suscribirme a mas de un IDOC de SAP y por una cuestión de orden y buenas practicas en la arquitectura del proyecto de EAI en el que estoy trabajando los IDOCs debían ser recepcionados por la misma receive location.&lt;br /&gt;La solucion vino de la mano de un &lt;a href="http://misopiniones.spaces.live.com/blog/cns!2737DC89A4AAB26B!1261.entry"&gt;Groso&lt;/a&gt; y en este post trato de pasar en claro la forma en la que puede hacer andar esto y por supuesto configurarlo.&lt;br /&gt;La idea es básicamente crear una Pipeline la cual se encargue de desensamblar los IDOCs que lleguen a una determinada receive location y posteriormente configurar la pipeline construida en la receive location que necesitamos realice el trabajo.&lt;br /&gt;&lt;br /&gt;El primer paso seria como venimos hablando generar una nueva Pipeline.&lt;br /&gt;Debido a que los esquemas que Biztalk genera cuando importamos la estructura del IDOC sera local en cada proyecto en el que se hizo la importación, pero publico para cualquier proyecto que referenecie voy a hacer de cuenta que los esquemas son importados en los proyectos en los que se encuentran las orquestaciones con lógica y la pipeline se desarrollara en un assembly aparte.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;En definitiva los proyectos de Biztalk o assemblys que contendría los esquemas de los IDOCs se verían así en el caso del primero:&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5282397440096729842" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 134px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_EBB616fU4n0/SU7YfANl-vI/AAAAAAAAACw/LQDnxnFgCPs/s200/PrimerIDOC.JPG" border="0" /&gt;&lt;br /&gt;Y así para el caso del segundo (pueden ser la cantidad que uno quiera o necesite):&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 552px; CURSOR: hand; HEIGHT: 380px; TEXT-ALIGN: center" alt="" src="http://img211.imageshack.us/img211/8488/segundoidocft3.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;En la siguiente instancia toca construir la Pipeline que nos va a solucionar el problema, la misma podría estar en un assembly aparte, esto es porque sera necesario referenciar las proyectos anteriormente construidos. Resumiendo en tres pasos el proceso de construcción de este proyecto serian básicamente, construirlo, referenciar los assemblys que contienen los esquemas correspondientes a cada IDOC y agregar una Pipeline de recepción que "desensamble" el IDOC correspondiente. Para esto en la Pipeline deberemos agregar tanto shapes de Flat File Disassemble como esquemas de IDCOs tengamos referenciados y configurar en cada sahpe arrastrado un el esquema correspondiente. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 552px; CURSOR: hand; HEIGHT: 559px; TEXT-ALIGN: center" alt="" src="http://img126.imageshack.us/img126/7340/referenceidocir1.jpg" border="0" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img id="BLOGGER_PHOTO_ID_5282398038590799858" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 154px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_EBB616fU4n0/SU7ZB1xsv_I/AAAAAAAAAC4/kbxix6FUVDU/s200/disassemble1.JPG" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5282398883347800194" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 156px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_EBB616fU4n0/SU7ZzAvdoII/AAAAAAAAADA/HGj1w7ASyTU/s200/disassemble2.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;En lo que respecta a desarrollo esto seria todo. Quedaría finalmente hacer deploy de nuestros assemblys en el servidor y configurar, que es por cierto la parte mas sencilla, simplemente al crear nuestra Receive Location creada para recibir los IDOCs informarle que debera utilizar la Pipeline creada y recientemente desplegada en nuestro server de la siguiente manera:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5282399919927432834" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 166px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_EBB616fU4n0/SU7avWTTloI/AAAAAAAAADI/7LcrNIOFP1A/s200/Configure.JPG" border="0" /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Eso seria todo, espero que pueda servirle.&lt;/p&gt;&lt;p&gt;Ariel Serlin&lt;/p&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/1007425235891530702-261824703877602603?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/261824703877602603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=261824703877602603' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/261824703877602603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/261824703877602603'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/12/suscribirse-multiples-idocs-en-una.html' title='Suscribirse a multiples IDOCs en una misma ReceiveLocation ( Biztalk )'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EBB616fU4n0/SU7YfANl-vI/AAAAAAAAACw/LQDnxnFgCPs/s72-c/PrimerIDOC.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-7841291197662481489</id><published>2008-12-01T05:19:00.001-08:00</published><updated>2008-12-01T07:09:23.845-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Loggin'/><category scheme='http://www.blogger.com/atom/ns#' term='Logging Biztalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Log'/><category scheme='http://www.blogger.com/atom/ns#' term='Biztalk'/><title type='text'>Logging "Sencillo" en Biztalk</title><content type='html'>En la casi todas las ocasiones en las que uno trabaja con Biztalk Server, es imprescindible poder loguear resultados, mensajes o excepciones en algún archivo de texto plano o en el visor de eventos de nuestro server, ya que al no tener interfaz de usuario la única manera de poder analizar detalladamente la ejecución de nuestro flujo de trabajo (workflow) diseñado es analizando el log escrito por la orquestación. Indudablemente lo más conveniente y aconsejable para esta tarea seria utilizar alguna de las librerías ya diseñadas para esta tarea, podrían ser Enterprise Library o Log4Net las más conocidas y que de hecho funcionan bastante bien.&lt;br /&gt;&lt;br /&gt;Pero debido a que el uso de estas librerías implica tener que configurar o modificar archivos de conflagración y confeccionar algunos mas en el caso de EntLib, en muchos casos para poder hacer pruebas rápidas o para el caso en el que el entorno va a ser utilizado solo para probar alguna versión nueva de alguna tecnología (me a tocado tener que trabajar en varias maquinas virtuales ) dejo esta pequeña assembly en la cual existen 2 métodos.&lt;br /&gt;El primero solo loguea el valor de alguna variable y el segundo permite escribir contenido de todo un mensaje en un archivo de log.&lt;br /&gt;El código de la clase conteniendo ambos métodos seria:&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 600px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;[Serializable]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#000000;"&gt;ArielLog&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;    {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#000000;"&gt;WriteValue&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;File.AppendAllText("&lt;/span&gt;&lt;span style="color:#990000;"&gt;C:\\ArchivosLog.txt&lt;/span&gt;&lt;span style="color:#000000;"&gt;",&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;System.Diagnostics.EventLog.WriteEntry("&lt;/span&gt;&lt;span style="color:#990000;"&gt;BizTalkLog&lt;/span&gt;&lt;span style="color:#000000;"&gt;",&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#000000;"&gt;WriteMessage(XLANGMessage msg)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;XmlDocument doc = (XmlDocument)msg[0].RetrieveAs(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(XmlDocument));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; &lt;span style="color:#000000;"&gt;mensaje = doc.InnerXml;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;File.AppendAllText("&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;C:\\Mensjaes.txt&lt;/span&gt;&lt;span style="color:#000000;"&gt;", mensaje);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="FONT-SIZE: 11px; MARGIN: 0em; COLOR: #ffffff"&gt;&lt;span style="font-size:85%;"&gt;       &lt;span style="color:#000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em; WIDTH: 100%font-family:consolas,'Courier New',courier,monospace;font-size:11px;color:#ffffff;"   &gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y para usar estos dos métodos simplemente restaría referenciar a la assembly en la que se encuentra la clase que los contiene y ya podrían ser llamados desde cualquier shape de expresión de la siguiente manera:&lt;br /&gt;&lt;br /&gt;Para loguear un mensaje&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5274830579324380146" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 124px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_EBB616fU4n0/STP2dvL_Y_I/AAAAAAAAACA/xE_LIs-jIlc/s320/LogMensaje.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O para loguear el valor de una variable:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5274830839619486898" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 118px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_EBB616fU4n0/STP2s43LhLI/AAAAAAAAACI/UUHWB_JKFSU/s320/logVariable.JPG" border="0" /&gt;Eso seria todo, por si alguien quiere recompilar la librería para cambiarle el nombre o lo que fuera, adjunto una solución con el código de la assembly firmado para poder ser subida a la GAC y así poder utilizarla desde Biztalk Server.&lt;br /&gt;&lt;br /&gt;Ariel Serlin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para bajar el código hace click aquí&lt;br /&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b311130212b6846e.skydrive.live.com/embedrow.aspx/P%c3%bablico/ArielLogging.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1007425235891530702-7841291197662481489?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/7841291197662481489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=7841291197662481489' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/7841291197662481489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/7841291197662481489'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/12/logging-sencillo-en-biztalk.html' title='Logging &quot;Sencillo&quot; en Biztalk'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EBB616fU4n0/STP2dvL_Y_I/AAAAAAAAACA/xE_LIs-jIlc/s72-c/LogMensaje.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-2768970810391191953</id><published>2008-11-23T12:44:00.000-08:00</published><updated>2008-11-26T10:11:59.176-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebService Exception'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP Excepction'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAPException'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Exception'/><title type='text'>Manejo de Excepciones en Web Services (SOAP Exceptions) con .Net</title><content type='html'>Por segunda vez :-( , me toca renegar un poco con el manejo de excpecion que son lanzadas desde web services estándares (no WCF) y hago este post con el solo fin de recordar cómo era para la próxima vez que me toque y por si a alguien más pudiera servirle.&lt;br /&gt;&lt;br /&gt;Como sabrán las excepciones lanzadas desde un servicio web (SOAP Exceptions) tienen la particularidad que la propiedad InnerException llega al cliente que consume el servicio por lo general (siempre en mi caso) vacía. Existe sin embargo, en este tipo particular de excepción, una propiedad llamada ¨Detail¨ la cual es perfectamente serializable como XML y puede ser enviada al cliente para su manejo sin ningún tipo de inconveniente.&lt;br /&gt;&lt;br /&gt;Ahora bien, para ser lo más explicativo posible, voy a partir del supuesto de que nuestra solución esta desarrollada en distintas capas y la excepción no se genera siempre en el WebMethod que consume el cliente que deberá manejar esta excepción. Pues bien, vamos a suponer que en el caso de nuestra capa de servicios ocurre una excepción y es lanzada hacia alguna capa superior:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 600px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#000000;"&gt;lanzarException()&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;     {&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;         &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;         {&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;             &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;Exception("&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Se produjo la exception que podria haber sido SQL o regla de negocio&lt;/span&gt;&lt;span style="color:#000000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;         }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;         &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;         {&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;             &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; e;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;         }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;     }&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una vez capturada esta excepción, el paso siguiente seria extraer la información de la misma y darle el formato correcto para poder insertar la información extraída, insertarla en un XML y luego "copiar" el mismo en la propiedad detail de la SoapException queremos informar. Para un fin práctico es puesto el código de esta funcionalidad en un método estático (no necesita crearse una instancia de la clase que lo contiene). Es conveniente también que la clase que contiene este metodo este en el mismo proyecto que los servicios web que estamos publicando (Carpeta App_Code) para así poder ser llamada desde cualquier parte del proyecto web.&lt;br /&gt;La funcionalidad de dicho método debería ser como sigue:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 600px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#000000;"&gt;SoapException BuildSoapException&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; infoInnerNode)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;        {&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;// Nodo con detalles de excepcion.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            System.Xml.XmlDocument doc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Xml.XmlDocument();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;System.Xml.XmlNode node = doc.CreateNode(XmlNodeType.Element,&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                 SoapException.DetailElementName.Name, SoapException.DetailElementName.Namespace);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;//Genero informacion especifica para una soap Exception&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;//Agrago el child nodo para el XML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            System.Xml.XmlNode details =&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;              &lt;span style="color:#000000;"&gt;doc.CreateNode(XmlNodeType.Element,&lt;/span&gt; "&lt;span style="color:#8b0000;"&gt;NodoInformacion&lt;/span&gt;",&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;                             "&lt;span style="color:#8b0000;"&gt;http://tempuri.org/&lt;/span&gt;");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;System.Xml.XmlNode detailsChild =&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;              doc.CreateNode(XmlNodeType.Element,&lt;/span&gt; "&lt;span style="color:#8b0000;"&gt;childConSpecialInfo&lt;/span&gt;",&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;                             "&lt;span style="color:#8b0000;"&gt;http://tempuri.org/&lt;/span&gt;");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;details.InnerText = infoInnerNode;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;            details.AppendChild(detailsChild&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;// Meto el child adentro del nodo que acabo de crear.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            node.AppendChild(details);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;//Lanzo la excepcion     &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;//el parametro SoapException.ClientFaultCode indica que la llamada desde el cliente fue incorrecta &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;//en formato o parametros&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;SoapException se&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;SoapException("&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Error de parametros,  formato, datos desde el cliente&lt;/span&gt;",&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;              &lt;span style="color:#000000;"&gt;SoapException.ClientFaultCode,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;              "&lt;span style="color:#8b0000;"&gt;SeviciosContosoGetProductos&lt;/span&gt;",&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;"&gt;              &lt;span style="color:#000000;"&gt;node);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;"&gt;se;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#cbf8fa;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#fbfbfb;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;        }&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y suponiendo que la clase que contiene a dicho método se llamara SOAPExceptionBuilder podríamos simplificar el catch de nuestros web methods de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 600px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;  &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(Exception e)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;        {/&lt;/span&gt;&lt;span style="color:#008000;"&gt;* Este es el catch a poner el los WebMethods*/&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;SOAPExceptionBuilder.exceptionALanzar = SOAPExceptionBuilder.BuildSoapException(e.Message);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#000000;"&gt;SOAPExceptionBuilder.exceptionALanzar;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finalizada la parte de servidor de cómo construir una Soap Exception solo restaría ver el trato que deberíamos darle del lado del cliente una vez que esta excepción fue capturada, pues bien, como decíamos al principio la propiedad detail de nuestra excepción no contiene otra cosa que no sea un XML por lo que podríamos recorrerlo y mostrar los detalles del error, crear una nueva excepción con los datos obtenidos o simplemente loguearlos. Una de las formas de recorrerlo sería la siguiente (yo solo los muestro por pantalla pero podría ser cualquier de las opciones anteriores):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #cecece 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cecece 1px solid; PADDING-LEFT: 5px; MIN-HEIGHT: 40px; BORDER-BOTTOM-WIDTH: 1px; OVERFLOW: auto; BORDER-LEFT: #cecece 1px solid; WIDTH: 600px; PADDING-TOP: 5px; BORDER-BOTTOM-: 5pxcolor:#cecece;" &gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; &lt;span style="color:#000000;"&gt;(SoapException error)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;color:#000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;            System.Xml.XmlNode node = error.Detail;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; s = "&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;";&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; &lt;span style="color:#000000;"&gt;(System.Xml.XmlNode nod in node.ChildNodes)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;                 s = nod.InnerText;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;          &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#008000;"&gt;// LLeno los controles con los detalles de la exception&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;      &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;TextBox1.Text = "&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Fault Code Namespace : &lt;/span&gt;&lt;span style="color:#000000;"&gt;" + error.Code.Namespace;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;TextBox2.Text = "&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;SOAP Actor que lanzo la exception :&lt;/span&gt;&lt;span style="color:#000000;"&gt; " + error.Actor;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;          &lt;span style="color:#000000;"&gt;  TextBox3.Text = "&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Detalles : &lt;/span&gt;&lt;span style="color:#000000;"&gt;" + s;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;            &lt;span style="color:#000000;"&gt;TextBox4.Text = "&lt;/span&gt;&lt;span style="color:#8b0000;"&gt;Mensaje :&lt;/span&gt;&lt;span style="color:#000000;"&gt; " + error.Message;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;            return;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0em;font-size:11px;color:#ffffff;"  &gt;&lt;span style="font-size:85%;"&gt;        &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eso seria todo, espero que sirva y acordarme donde lo puse la proxima que lo tenga que usar :-)&lt;br /&gt;&lt;br /&gt;Adjunto el código correspondiente a una solución en la que se encuentra un proyecto con "lógica" para lanzar una excepción cualquiera, un servicio que instancia esta clase y un proyecto web con una página que consume dicho servicio con todo el código utilizado en el ejemplo.&lt;br /&gt;&lt;br /&gt;Ariel Serlin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para bajar el codigo hace click aqui:&lt;br /&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b311130212b6846e.skydrive.live.com/embedrow.aspx/P%c3%bablico/WebException.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1007425235891530702-2768970810391191953?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/2768970810391191953/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=2768970810391191953' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/2768970810391191953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/2768970810391191953'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/11/manejo-de-excepciones-en-web-services.html' title='Manejo de Excepciones en Web Services (SOAP Exceptions) con .Net'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-2678797045626931177</id><published>2008-09-29T13:24:00.000-07:00</published><updated>2008-11-13T18:01:02.506-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RSA'/><category scheme='http://www.blogger.com/atom/ns#' term='Encriptacion'/><category scheme='http://www.blogger.com/atom/ns#' term='ConnectionStrings'/><category scheme='http://www.blogger.com/atom/ns#' term='Decrypt'/><category scheme='http://www.blogger.com/atom/ns#' term='Web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='Encrypt'/><category scheme='http://www.blogger.com/atom/ns#' term='DPAPI'/><title type='text'>Encriptacion de entradas en el Web.Config</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;Algo que me resulto realmente muy útil y muy sencillo de utilizar fue la herramienta que trae el SDK de .Net para poder encriptar distintas entradas o claves alojadas en el archivo Web.Config Con anterioridad a esta utilidad, una de las cosas que tocaban hacer era en el momento de hacer el deploy de una aplicación, era crear alguna utilidad mediante la cual el usuario, por lo general alguna persona del área de operación o infraestructura, pudiera editar claves o valores de configuración, encriptarlas o desencriptarlas para poder cambiar sus valores. Paso comentar alguna de las características de esta herramienta, aspnet_regiis.exe. Para comenzar las posibilidades de encriptacion son: mediante algoritmo RSA (Trafico de claves publicas y privadas) o mediante DPAPI (Data Protection application programming interface ). No es necesario tener el entorno de desarrollo instalado en la maquina en la que se quiere realizar la encriptacion/desencriptacion, si tiene que estar instalado el .Net Framework.&lt;br /&gt;&lt;br /&gt;Me resulto bastante más útil el hecho de utilizar RSA por el hecho de que por lo general hay aplicaciones que necesitan ser desplegadas en un conjunto de servidores y con RSA se tiene la posibilidad de exportar la clave para después ser llevada a cada server en el que necesitemos desplegar nuestro sitio. Yendo al punto en cuestión, la herramienta puede ser accedida por línea de comandos como se accede a cualquier otra herramienta del SDK de .Net, desde el menú de Inicio-&gt;All Programs-&gt;Microsft Visual Studio 2005-&gt;Visual Studio Tools-&gt;Command Prompt Aquí las dos primeras opciones: El comando para encriptar puede trabajar tanto como rutas relativas o "virtuales” como absolutas o a la hora de indicarla la ubicación de nuestro web.config por lo que si queremos trabajar con rutas absolutas es aconsejable ubicarse en el mismo directorio físico en el que se encuentra el archivo a encriptar.&lt;br /&gt;&lt;br /&gt;Un vistazo de mi web.config antes de ser encriptado seria algo asi:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5257455042009170818" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 404px; CURSOR: hand; HEIGHT: 82px; TEXT-ALIGN: center" height="95" alt="" src="http://1.bp.blogspot.com/_EBB616fU4n0/SPY7gWmLA4I/AAAAAAAAABg/YKdhbnGoSJY/s400/NonEncripted.JPG" width="424" border="0" /&gt; &lt;/span&gt;&lt;p align="left"&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Ahora si:&lt;br /&gt;Si vamos utilizar parametros pasando la ruta virtual la opcion seria:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;aspnet_regiis -pe "SeccionAEncriptar" -app "RutaVirtual" &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Si vamos utilizar parametros pasando la ruta fisica de la aplicacion la opcion seria:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;aspnet_regiis -pef "SeccionAEncriptar" -app "RutaFisica" &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Por defecto, es decir si no especificamos un proveedor de encriptacion o metodo se realizara con RSAProtectedConfigurationProvider, podemos sin embargo combiarlo si lo especificamos en el parametro -prov y quedaria de la siguiente manera&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;aspnet_regiis -pef "SeccionAEncriptar" -app "RutaFisica"–prov "DataProtectionConfigurationProvider"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Para realizar la desencripatcion de los datos los procedimientos son los mismos, con la diferencia de que el parámetro pasado a al ejecutable aspnet_regiis deber ser: -pdf (en lugar de -pef si es que usamos rutas absolutas o fisicas ).&lt;br /&gt;&lt;br /&gt;En este punto estamos ya en condiciones de tomar algunos recaudos:&lt;br /&gt;La encriptación/desencriptación deberá realizarse en el mismo entorno en donde se encontrara instalada la solución, es decir una vez encriptados los datos, el archivo web.config no podrá ser desencriptado en otra máquina, esto es debido a que cuando utilizamos este comando las claves privadas se almacenan localmente en: C:\Documents and Settings\All Users\Datos de programa\Microsoft\Crypto\RSA\MachineKeys, demas esta decir que debemos tener permiso de escritura sobre esta carpeta.&lt;br /&gt;&lt;br /&gt;Esta ultima aclaración servirá para darnos cuenta que al importarse la clave a nivel local en nuestra maquina, es muy probable que en un entorno distribuido (granja de servidores o server farms) algo pueda estar fallando, efectivamente deberemos asegurarnos de que nuestro web.config cuenta con la sección &lt;configprotecteddata&gt;en la cual podremos indicar cual será nuestro contenedor de claves, la especificación de esta sección (configProtectedData) debería ser algo como:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268316101234898354" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 399px; CURSOR: hand; HEIGHT: 66px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_EBB616fU4n0/SRzRlNKTtbI/AAAAAAAAAB4/BDlSYOsvWDo/s400/Contenedor.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Restaría entonces crear el contenedor de claves de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;aspnet_regiis -pc "MiContenedor" –exp&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Se crea así un nuevo contenedor para la clave de encriptación RSA, asignando el nombre "MiContenedor" y por ultimo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;aspnet_regiis -pa "MiContenedor" "ASPNET"&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Donde "MiContenedor" deberá ser el mismo nombre asignado en –pc del comando anterior y que se corresponde con keyContainerName="MiContenedor"/&gt; de webconfig.&lt;br /&gt;&lt;br /&gt;Una ultima acotación sobre este tema que me pareció realmente practico, todo esto es a nivel de configuración de nuestro sitio, es decir que el acceso a las entradas de nuestro web.config desde el código sigue siendo igual que si no hubiéramos tocado nada, si lo que encriptamos fueron nuestras cadenas de conexión el acceso seria:&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;string strConString = ConfigurationManager.ConnectionStrings["MiConectionString"].ConnectionString;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Eso es todo y así de simple :-)&lt;br /&gt;&lt;br /&gt;Ariel Serlin&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&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/1007425235891530702-2678797045626931177?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/2678797045626931177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=2678797045626931177' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/2678797045626931177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/2678797045626931177'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/09/encriptacion-de-entradas-en-el.html' title='Encriptacion de entradas en el Web.Config'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EBB616fU4n0/SPY7gWmLA4I/AAAAAAAAABg/YKdhbnGoSJY/s72-c/NonEncripted.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1007425235891530702.post-3534711229044126384</id><published>2008-09-05T12:25:00.001-07:00</published><updated>2008-09-13T20:32:25.452-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Suspend Acitvity'/><category scheme='http://www.blogger.com/atom/ns#' term='State Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Workflow Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='Persistence Service'/><title type='text'>Workflow State Machine y  Persistence Service</title><content type='html'>En la primera entrada de este blog voy a tratar de mostrar un ejemplo sencillo de utilización de maquinas de estado creadas con Windows Workflow Foundation. Como un amigo me consulto hace poco como haría para trabajar con State Machine Workflows y además utilizar el Persistence Service (serializar un workflow en una base de datos temporalmente) aprovecho la volada para hacer el post.&lt;br /&gt;&lt;br /&gt;La idea básicamente de este tipo de workflow es modelar los distintos estados por los que podría pasar un documento o ítem cualquiera como por ejemplo, una factura, un comprobante o cualquier otra cosa que pudiera necesitar ser creado, aprobado, revisado y pueda volver a cualquier de estos estados anteriores.&lt;br /&gt;&lt;br /&gt;El primer paso para comenzar a trabajar es ver que tengamos en nuestra PC todos los requisitos para poder trabajar con Workflow Fondation.&lt;br /&gt;&lt;br /&gt;En caso de Visual Studio 2005, deberemos tener instalado la versión 3.0 del .Net Framework, las extensiones para workflow foundation y haber creado las bases de datos de persistencia de y tracking de Workflow Foundation, los scripts de creación están generalmente en el directorio: ( C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN )&lt;br /&gt;&lt;br /&gt;Verificados estos requisitos podemos abrir Visual Studio y comenzar a trabajar.&lt;br /&gt;&lt;br /&gt;El primer paso será crear un nuevo proyecto del tipo State Machine Workflow Librery&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5242625822265835346" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_EBB616fU4n0/SMGMaKJx_1I/AAAAAAAAAAY/QjQePOUaDKw/s320/ProyectoInicial.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Una vez creado el proyecto, podremos comenzar a trabajar con el diseñador de workflow haciendo doble click sobre la clase creada por defecto "Workflow1.cs", en este ejemplo asumiré que solo se trabaja con dos estados posibles, más un estado final.&lt;br /&gt;El diseño de lo que puede suceder en cada estado que identifiquemos seguramente podrá variar mucho de acuerdo al problema que se esté modelando, pero básicamente la idea que trato de mostrar en este caso sería como pasar de un estado a otro, ejecutar algo de código al pasar a ese estado y luego suspender o serializar el workflow hasta que necesitemos utilizar esa instancia nuevamente.&lt;br /&gt;&lt;br /&gt;Para hacer que nuestros estados "escuchen o esperen" realizar alguna acción deberemos prepararlos o hacer que se suscriban a un determinado evento, esto seria básicamente agregando tantos Shapes de EventDriven como eventos queremos que se manejen en un estado.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5244064909790805458" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_EBB616fU4n0/SMapQE8r_dI/AAAAAAAAAAg/a7_mKN9_vTs/s320/EventDriven.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Una vez realizado esto el paso siguiente seria manejar cada uno de los eventos que queremos capturar en cada estado y por cada EventDriven que hayamos manejado. Es aquí donde viene la parte en la que tenemos que escribir un poco de código...,&lt;br /&gt;&lt;br /&gt;Necesitaremos primero una clase que herede de ExternalDataEventArgs y de esta forma poder dar a nuestra clase la capacidad de enviar datos a cuando se lanzan eventos, es muy importante que esta clase está marcada con el atributo [Serializable].&lt;br /&gt;&lt;br /&gt;El paso posterior a este, seria modelar una interfaz de comunicación la cual deberá estar marcada con el atributo [ExternalDataExchange] y declarar en esta interfaz todos los eventos que vallamos a lanzar en una clase que implementará la interfaz en cuestión, adelantando un poco de que se trata esto el sentido real de esta interfaz de comunicación es poder decir a nuestros estados cuales son los métodos que deberán estar escuchando una vez instanciado nuestro workflow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5244072877409993682" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_EBB616fU4n0/SMawf2pIg9I/AAAAAAAAAAo/bhxFclpMwV0/s320/Interfaz.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Siguiendo con la misma línea tocaría ahora construir una clase que implemente la interfaz recién modelada. De esta forma estaríamos ya en condiciones con continuar el modelado de nuestro flujo de trabajo y teniendo ya las clases que exponen los métodos declarados en la misma podemos avisarle a nuestro flujo de trabajo en qué momento deberá escuchar algún evento o serializarse y persistirse en una base de datos. Para poder hacer esto deberemos hacer doble click sobre alguno de nuestros EventDriven, como comentaba al principio dentro de cada de EventDriven podemos hacer muchas cosas pero a fines explicativos solo pasare de un estado a otro o simplemente persistir el flujo de datos en la DB de persistencia de WorkflowFoundation, para cualquier de los dos casos haciendo doble click sobre cualquier EventDriven podemos agregar Shapes de HandleExternalEvent, que como su nombre lo indica mediante estos podríamos manejar los eventos que fueron lanzados e identificados por los EventDriven, por supuesto después de la ejecución cada EventDriven podemos hacer invocar un Suspend (mas abajo explico un poco mas ) o un SetState&lt;br /&gt;Con los segundo SetState principalmente logramos que nuestro workflow pase de un estado a otro, sencillamente lo que debemos hacer al usar estos shapes es decirle a que estado deberá moverse el workflow cuando la ejecución paso por el mismo, algo muy bueno que vi en este tipo de workflows es que a medida que vamos crenado las distintas transiciones mediantes nuestros SetState dentro de nuestros posibles estados, workflow se encarga de mostrar en forma grafica las nuevas transiciones&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5245212425883743298" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_EBB616fU4n0/SMq86ThD9EI/AAAAAAAAAAw/G9w5pHaS_y4/s320/SetState.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Respecto de los Suspend, es muy importante verificar la configuración de los dos parámetros TimeSpan que pide el servicio de persistencia de Workflow Foundation (Persistence Service) al momento de agregar este servicio a nuestro workflow, en el caso del primer parámetro indica durante cuando tiempo nuestro workflow será "dueño" de esa instancia, y el segundo le indica a WF cada cuánto va a ir a nuestra DB a buscar workflow que hayan expirado, teniendo las precauciones recién mencionadas básicamente dotamos a nuestro workflow de la capacidad de automatizar totalmente la persistencia de nuestras instancias en una DB (es válido aclarar que tiene que ser SQL2005).&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5245223685407339986" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_EBB616fU4n0/SMrHJsgrddI/AAAAAAAAABA/5wiUIFpRoAU/s320/Suspend.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finalmente mi workflow tiene una forma como la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5245225373448165906" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_EBB616fU4n0/SMrIr88-WhI/AAAAAAAAABI/mJUMnqUDQtw/s320/WorkflowFinished.JPG" border="0" /&gt;&lt;br /&gt;Para terminar algunas acotaciones de cosas que me parecieron realmente muy buenas y otras no tanto.&lt;br /&gt;Una de las buenas es la rapidez con la que se puede modelar un diagrama de estados, incluso esta bueno sentarse con el usuario al lado y mostrarle como quedaría la lógica de su proceso, pocas veces he tenido la oportunidad de hacer que el usuario me diga "en tiempo de diseño", no esto debería ser de la siguiente manera....&lt;br /&gt;Otra muy buena es que Workflow Fondation provee un conjunto de clases que mediante Generics nos indican el estado actual y los próximos estados posibles de nuestras instancias y la búsqueda de toda esta info viene gratis con el servicio de persistencia. Pueden ver esto implementado en el método [WorkflowStates verEstados(Guid pguid)] de la clase&lt;br /&gt;La no muy buena es la especificación de las excepciones, me parecen poco claras cuando ocurren, pero seguro que en algún momento la van a mejorar&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Adjunto el código correspondiente al proyecto de workflow y una pequeña aplicación de prueba, espero que sirva&lt;/p&gt;&lt;br /&gt;Ariel Serlin&lt;br /&gt;&lt;br /&gt;Para bajar el codigo hace click aqui&lt;br /&gt;&lt;iframe style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 26px; BACKGROUND-COLOR: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b311130212b6846e.skydrive.live.com/embedrow.aspx/P%c3%bablico/WorkflowLibrary1.rar" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1007425235891530702-3534711229044126384?l=arielserlin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arielserlin.blogspot.com/feeds/3534711229044126384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1007425235891530702&amp;postID=3534711229044126384' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/3534711229044126384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1007425235891530702/posts/default/3534711229044126384'/><link rel='alternate' type='text/html' href='http://arielserlin.blogspot.com/2008/09/en-la-primera-entrada-de-este-blog-voy.html' title='Workflow State Machine y  Persistence Service'/><author><name>Ariel Serlin</name><uri>http://www.blogger.com/profile/17493906644473276730</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EBB616fU4n0/SMGMaKJx_1I/AAAAAAAAAAY/QjQePOUaDKw/s72-c/ProyectoInicial.JPG' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
