<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results for 'app:weblogs' matching tag '.NET 3.5'</title><link>http://msmvps.com/search/SearchResults.aspx?q=app:weblogs&amp;tag=.NET+3.5&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tag '.NET 3.5'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>[VSTS] Integrando Flex con VSTS</title><link>http://msmvps.com/blogs/ffagas/archive/2009/09/15/vsts-integrando-flex-con-vsts.aspx</link><pubDate>Tue, 15 Sep 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1723598</guid><dc:creator>ffagas</dc:creator><description>&lt;p align="justify"&gt;&lt;b&gt;Introducción&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Este artículo se revisará como integrar una interface hecha en Flex Builder 3.0 con objetos de .Net, en post anteriores se revisó como hacer la integración entre Flex y TFS 2008 utilizando el plugin de teamprise en esta ocasión veremos que al momento que integramos nuestro proyecto de Flex a Visual Studio 2008 automáticamente nos habilita la administración de dicho código. &lt;/p&gt;  &lt;p align="justify"&gt;Ver más: &lt;a title="http://geeks.ms/blogs/ffagas/archive/2009/09/15/vsts-integrando-flex-con-vsts.aspx" href="http://geeks.ms/blogs/ffagas/archive/2009/09/15/vsts-integrando-flex-con-vsts.aspx"&gt;http://geeks.ms/blogs/ffagas/archive/2009/09/15/vsts-integrando-flex-con-vsts.aspx&lt;/a&gt;&lt;/p&gt;</description></item><item><title>RESTful WCF Service</title><link>http://msmvps.com/blogs/abu/archive/2009/07/08/restful-wcf-service.aspx</link><pubDate>Wed, 08 Jul 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1698782</guid><dc:creator>abu</dc:creator><description>&lt;p&gt;RESTful WCF Services works by identifing the Resources &amp;amp; Action from Uniform Resource Identifiers (URIs).&lt;/p&gt;
&lt;p&gt;A RESTful web service is called by a unique URI to refer a resource and HTTP verb is to define actions to the resource.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTTP Method - Verb&lt;br /&gt;&lt;/strong&gt;GET &amp;ndash; Fetch &lt;br /&gt;PUT &amp;ndash; Update/Insert &lt;br /&gt;DELETE &amp;ndash; Delete &lt;br /&gt;POST &amp;ndash; Append &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;webHttpBinding&lt;/strong&gt; is a new WCF binding in Fx 3.5 to develop RESTful services. This does not use SOAP envelopes HTTP and HTTPS Transports. It supports XML, JSON and Binary (streams).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WebServiceHost&lt;/strong&gt; is a specialized SerivceHost which automatically configures address, binding, contract. &lt;br /&gt;If no endpoint is defined, WebServiceHost automatically creates a default endpoint. WebServiceHost adds WebHttpBehavior and disables the HTTP Help page and the Web Services Description Language (WSDL) GET functionality.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;[&lt;strong&gt;WebGet&lt;/strong&gt;] And [&lt;strong&gt;WebInvoke&lt;/strong&gt;] attribute&lt;br /&gt;Binds a WCF operation to URI space and HTTP method Indicate the HTTP Method for the operation &lt;/p&gt;
&lt;p&gt;WebGet &amp;ndash; No method is require&lt;/p&gt;
&lt;p&gt;WebInvoke &amp;ndash; All verbs other than GET (Method parameter takes in the name of the Verb) &lt;/p&gt;
&lt;p&gt;Other&amp;nbsp;attributes can mentioed&lt;br /&gt;BodyStyle &amp;ndash; Indicates whether the Request/ Response are wrapped or not &lt;br /&gt;RequestFormat &amp;ndash; Json or Xml &lt;br /&gt;ResponseFormat &amp;ndash; Json or Xml &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UriTemplate&lt;/strong&gt; &amp;ndash; Rich binding to URI UriTemplate String that allows define the structure/pattern of the URI&lt;/p&gt;</description></item><item><title>Code de Webcast de Flujo de Trabajo con InfoPath</title><link>http://msmvps.com/blogs/haarongonzalez/archive/2009/07/02/1697589.aspx</link><pubDate>Thu, 02 Jul 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697589</guid><dc:creator>haaron</dc:creator><description>&lt;p&gt;Damas y caballeros &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez/8030.WebcastWorkflow.zip" target="_blank"&gt;aquí&lt;/a&gt; les dejo el proyecto de código de Visual Studio 2008 que generé durante el &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032413059&amp;amp;EventCategory=5&amp;amp;culture=es-AR&amp;amp;CountryCode=AR" target="_blank"&gt;WebCast de Construccion de Flujos de Trabajo con Formularios InfoPath 2007&lt;/a&gt;. Espero les sirva y muchas gracias por haberme seguido todos hasta el final. &lt;/p&gt;  &lt;p&gt;Saludos.&lt;/p&gt;</description></item><item><title>[Evento] Invitaci&amp;#243;n a Evento Aprendiendo con MsGuayaquil</title><link>http://msmvps.com/blogs/ffagas/archive/2009/05/26/evento-invitaci-243-n-a-evento-aprendiendo-con-msguayaquil.aspx</link><pubDate>Tue, 26 May 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1693127</guid><dc:creator>ffagas</dc:creator><description>&lt;p&gt;Amigos, en esta ocasión quiero compartirles la invitación al evento que la comunidad de Microsoft en Guayaquil va a realizar el próximo 6 de Junio de 2009. A continuación les copiaré la invitación al evento, así como el link donde podrán encontrar mayor información como registro, detalle de conferencias, etc.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msguayaquil.com/blogs/lespinoza/archive/2009/05/25/aprendiendo-con-msguayaquil-s-225-bado-6-de-junio-del-2009-auditorio-ecotec.aspx" href="http://msguayaquil.com/blogs/lespinoza/archive/2009/05/25/aprendiendo-con-msguayaquil-s-225-bado-6-de-junio-del-2009-auditorio-ecotec.aspx"&gt;http://msguayaquil.com/blogs/lespinoza/archive/2009/05/25/aprendiendo-con-msguayaquil-s-225-bado-6-de-junio-del-2009-auditorio-ecotec.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/Publicidad20MsGuayaquil206Junio202009_5F00_1207BA04.jpg"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="Publicidad%20MsGuayaquil%206Junio%202009" border="0" alt="Publicidad%20MsGuayaquil%206Junio%202009" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/Publicidad20MsGuayaquil206Junio202009_5F00_thumb_5F00_62F5585F.jpg" width="580" height="772" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>DataContractSerializer.ReadObject is easily confused.</title><link>http://msmvps.com/blogs/peterritchie/archive/2009/04/29/datacontractserializer-readobject-is-easily-confused.aspx</link><pubDate>Wed, 29 Apr 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1691575</guid><dc:creator>PeterRitchie</dc:creator><description>&lt;p&gt;With WCF services you need to declare contracts and generate contract classes that encapsulate those contracts.&amp;#160; Most of the time you can simply let the framework deal with whatever it needs to do to deal with these objects.&amp;#160; Sometimes, you need to actually see without running a service what XML would result from a contract object or serialize a contract object from XML text. &lt;/p&gt;  &lt;p&gt;In .NET 3.5 there exists the System.Runtime.Serialization.DataContractSerializer class that perform serialization of data contracts. &lt;/p&gt;  &lt;p&gt;Based on its documentation it seems fairly simple to create data contract object to/from XML methods.&amp;#160; For example: &lt;/p&gt;  &lt;div style="font-size:14pt;background:white;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; T XmlToContractObject&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; xml) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IExtensibleDataObject&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.Unicode.GetBytes(xml));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;XmlDictionaryReader&lt;/span&gt; reader = &lt;span style="color:#2b91af;"&gt;XmlDictionaryReader&lt;/span&gt;.CreateTextReader(memoryStream, &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.Unicode,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlDictionaryReaderQuotas&lt;/span&gt;(), &lt;span style="color:blue;"&gt;null&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;DataContractSerializer&lt;/span&gt; dataContractSerializer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataContractSerializer&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; dataContractSerializer.ReadObject(reader) &lt;span style="color:blue;"&gt;as&lt;/span&gt; T;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ContractObjectToXml&amp;lt;T&amp;gt;(T obj) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:#2b91af;"&gt;IExtensibleDataObject&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;DataContractSerializer&lt;/span&gt; dataContractSerializer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataContractSerializer&lt;/span&gt;(obj.GetType());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataContractSerializer.WriteObject(memoryStream, obj);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text = &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetString(memoryStream.GetBuffer());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;But, when you try to perform a round-trip from a contract object to XML and back you&amp;#39;ll notice that you get SerializationException with the cryptic message of &amp;quot;There was an error deserializing the object of type &amp;lt;sometype&amp;gt;.&amp;#160; The data at the root level is invalid&amp;quot;, despite that the XML seems view when examined. &lt;/p&gt;  &lt;p&gt;When Encoding.UTF8.GetString is called, it literally translates the entire array into a String object.&amp;#160; This means that it reads any and all 0 bytes in the array and dumps out null characters (&amp;#39;\0&amp;#39;) into the string.&amp;#160; Why do I mention this?&amp;#160; Well, MemoryStream uses a self-expanding buffer to write to.&amp;#160; When MemoryStream runs out of space in its buffer, it doubles the size of the buffer, zeroes it out, then copies the original buffer to the start of the new buffer.&amp;#160; When MemoryStream.GetBuffer is called it simply gets a reference to this buffer, regardless of how many bytes have been written to the stream.&amp;#160; So, most of the time you get a buffer with zeroes padded to the end of it. &lt;/p&gt;  &lt;p&gt;If you look closely at the resulting XML, there are a bunch of &amp;#39;\0&amp;#39; characters at the end of the string. &lt;/p&gt;  &lt;p&gt;As it turns out, DataContractSerializer.ReadObject (or something it calls) doesn&amp;#39;t like all the extra null characters and this is the cause of the SerializationException. &lt;/p&gt;  &lt;p&gt;Irritating as this may be, the fix is fairly straightforward.&amp;#160; Simply, create a new buffer equal to the length of the stream and copy the data from the MemoryStream buffer to the new one--trimming all the extra zeroes.&amp;#160; For example: &lt;/p&gt;  &lt;div style="font-size:14pt;background:white;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ContractObjectToXml&amp;lt;T&amp;gt;(T obj) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:#2b91af;"&gt;IExtensibleDataObject&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;DataContractSerializer&lt;/span&gt; dataContractSerializer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataContractSerializer&lt;/span&gt;(obj.GetType());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataContractSerializer.WriteObject(memoryStream, obj);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] data = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[memoryStream.Length];&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Array&lt;/span&gt;.Copy(memoryStream.GetBuffer(), data, data.Length);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text = &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetString(data);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f04%2f29%2fdatacontractserializer-readobject-is-easily-confused.aspx&amp;amp;title=DataContractSerializer.ReadObject+is+easily+confused."&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2009/04/29/datacontractserializer-readobject-is-easily-confused.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2009/04/29/datacontractserializer-readobject-is-easily-confused.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKick This" border="0/" /&gt;&lt;/a&gt;&lt;/div&gt;</description></item><item><title>DevTeach 2009 Vancouver</title><link>http://msmvps.com/blogs/peterritchie/archive/2009/03/26/devteach-2009-vancouver.aspx</link><pubDate>Thu, 26 Mar 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1681658</guid><dc:creator>PeterRitchie</dc:creator><description>&lt;p&gt;The schedule for DevTeach 2009 Vancouver has been announced (&lt;a href="http://www.devteach.com/" title="http://www.devteach.com/"&gt;http://www.devteach.com/&lt;/a&gt;).&amp;nbsp; There&amp;rsquo;s lots of great software development sessions from some of the leaders in our industry.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re planning on improving yourself, this is the conference to go to.&amp;nbsp; Not only can you attend excellent sessions; but you can hob-knob with the presenters and pick their brains.&lt;/p&gt;
&lt;p&gt;If you have a friend or co-worker who&amp;rsquo;s interested, there&amp;rsquo;s a limited-time two-for-one offer for an even better price: &lt;a href="http://www.devteach.com/Register.aspx" title="http://www.devteach.com/Register.aspx"&gt;http://www.devteach.com/Register.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f03%2f26%2fdevteach-2009-vancouver.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f03%2f26%2fdevteach-2009-vancouver.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Estaremos transmitiendo en vivo la pl&amp;#225;tica de la comunidad Tijuana.NET</title><link>http://msmvps.com/blogs/haarongonzalez/archive/2009/03/25/1681406.aspx</link><pubDate>Wed, 25 Mar 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1681406</guid><dc:creator>haaron</dc:creator><description>&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez/tijuana_5F00_590B4D4B.jpg"&gt;&lt;img title="tijuana" style="border-right:0px;border-top:0px;display:inline;margin:20px 30px 20px 20px;border-left:0px;border-bottom:0px;" height="173" alt="tijuana" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez/tijuana_5F00_thumb_5F00_532083E5.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;La plática que estaré dando hoy 25 de marzo para la comunidad de &lt;a href="http://tjnet.org"&gt;Tijuana.NET&lt;/a&gt; la podrás presenciar remotamente en línea vía live meeting. Para poder ver&amp;#160; requerás instalar el &lt;a href="http://office.microsoft.com/en-us/help/HA101733831033.aspx"&gt;Cliente de Livemeeting 2007&lt;/a&gt; y despues acceder a la charla &lt;a href="https://www.livemeeting.com/cc/mvp_no_voip/join?id=ZTPJ78&amp;amp;role=attend"&gt;Introducción de Productos y Tecnología SharePoint para Desarrolladores .NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo que veremos es:&lt;/p&gt;  &lt;p&gt;Que puede hacer por mi SharePoint, como empezar a desarrollar en SharePoint, arquitectura de WSS, arquitectura de MOSS, beneficios de SharePoint para programadores .NET, personalizando con SharePoint Designer 2007 y personalizando con Visual Studio 2008.&lt;/p&gt;  &lt;p&gt;Te esperamos!&lt;/p&gt;</description></item><item><title>[VS2008 – WWF – MOSS 2007] &amp;#191;C&amp;#243;mo crear tareas paralelas en MOSS 2007 desde Visual Studio 2008 ?</title><link>http://msmvps.com/blogs/ffagas/archive/2009/03/16/vs2008-wwf-moss-2007-191-c-243-mo-crear-tareas-paralelas-en-moss-2007-desde-visual-studio-2008.aspx</link><pubDate>Mon, 16 Mar 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1678381</guid><dc:creator>ffagas</dc:creator><description>&lt;p&gt;&lt;strong&gt;Introducción &lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="font-size:10pt;"&gt;En&amp;#160; un artículo anterior publiqué &lt;a href="http://msmvps.com/blogs/ffagas/archive/2008/08/07/vs-2008-moss-2007-191-c-243-mo-crear-actividades-personalizadas.aspx" target="_blank"&gt;cómo crear una tarea en MOSS 2007&lt;/a&gt;, en este artículo aprenderá cómo crear tareas paralelas en MOSS 2007 utilizando &lt;em&gt;Visual Studio 2008 Team Developer&lt;/em&gt;, Visual Studio 2008 nos permite crear de manera sencilla (al estilo Microsoft) flujos de trabajo para SharePoint, para esto disponemos de plantillas de proyecto al momento de empezar con la creación del mismo, en Microsoft Office SharePoint 2007 (MOSS 2007) podemos crear tareas en serie o en paralelo, las mismas que para crearlas las podemos hacer utilizando diferentes herramientas disponibles en el toolbox de Visual Studio 2008, en esta ocasión utilizaremos el replicator para la creación de las actividades en paralelo. &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Les recomiendo leer el artículo anteriormente mencionado y descargar su código ya que reutilizaremos el ejemplo anterior para la creación de las tareas. El código fuente del presente artículo lo pueden descargar de aquí:&lt;span style="font-size:10pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;a href="http://msmvps.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas.MOSS2007.WorkFlows/CreacionTareas.zip"&gt;Descargar código Fuente.&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Software Requerido &lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-size:10pt;"&gt;Windows Server 2003 o superior &lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-size:10pt;"&gt;Microsoft Office SharePoint 2007 (instalación stand alone) &lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-size:10pt;"&gt;Visual Studio 2008 Team Developer&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Desarrollo &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Empiece abriendo Visual Studio 2008 y agregando un nuevo proyecto a la solución anterior.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/001_5F00_07CCB765.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="001" border="0" alt="001" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/001_5F00_thumb_5F00_74E80DED.jpg" width="583" height="407" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;De la lista de Tipos de Proyectos seleccione Workflow y luego de la lista de plantillas SharePoint 2007 Sequential Workflow, le asigna un nombre a su proyecto y de clic en Ok.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/002_5F00_57B24016.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="002" border="0" alt="002" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/002_5F00_thumb_5F00_3A103F4A.jpg" width="581" height="406" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Visual Studio 2008 iniciará un asistente, el cual en esta primera ventana deberá asignarle el nombre&amp;#160; de su flujo de trabajo que desea que aparezca en SharePoint, e ingresar la url del sitio sobre el cual va a publicar el flujo de trabajo, Visual Studio 2008 en plataformas de 32 bits le permite publicar y hacer debug de sus flujos de trabajo para MOSS 2007, para lo cual utilizará la url proporcionada en este paso.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/003_5F00_06872267.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="003" border="0" alt="003" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/003_5F00_thumb_5F00_23ACCA71.jpg" width="604" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Si usted desea puede marcar para que automáticamente se asocie el flujo de trabajo que va a desarrollar con una librería en particular, caso contrario lo puede realizar manualmente utilizando comandos. Para la asociación automática debemos tener claro que significa cada elemento listado en este paso del asistente. El flujo de trabajo se debe asociar a una lista, esta lista será quien inicie el flujo de trabajo bajo ciertas condiciones, la lista de historial me permitirá almacenar toda la información relacionada al flujo de trabajo, por ejemplo: cuando inicio el flujo, cierta actividad, cuanto terminó, quién la terminó, etc., por último tenemos que seleccionar la lista de tareas, en esta lista el flujo de trabajo creará las tareas que nosotros le indiquemos. Antes de continuar y una vez entendido lo anterior pensemos en el siguiente escenario: Tenemos una librería de documentos que cada vez que se modifique un documento este deba ser aprobado por la persona X, persona Y o persona Z (esto implica que cualquiera de dichos usuarios puede aprobar el documento, es decir, estamos hablando de un flujo de aprobación en paralelo), para que dichos usuarios se enteren de que deben aprobar el documento debemos crear tareas y asignárselas para esto utilizaremos la lista de tareas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/004_5F00_47857BFE.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="004" border="0" alt="004" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/004_5F00_thumb_5F00_2A4FAE27.jpg" width="604" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En este paso final del asistente debemos seleccionar cuando queremos que el flujo de trabajo se inicie, basándonos en el ejemplo anterior debería seleccionar cuando el elemento cambie, pero en este caso yo quiero iniciar el flujo manualmente, razón por la cual selecciono sólo la primera acción.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/005_5F00_580D511F.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="005" border="0" alt="005" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/005_5F00_thumb_5F00_1CD97554.jpg" width="604" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una vez terminado el asistente se abrirá el diseñador del flujo, recuerden que para la creación de una tarea utilizaremos el ejemplo publicado en el artículo anterior, por lo cual debemos a este proyecto agregar la referencia al mismo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/006_5F00_6EED1EBA.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="006" border="0" alt="006" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/006_5F00_thumb_5F00_6AB32128.jpg" width="607" height="424" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En la ventana de referencias seleccione de proyectos BasicTaskActivity.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/007_5F00_2CE4F1B3.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="007" border="0" alt="007" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/007_5F00_thumb_5F00_11CC22A5.jpg" width="471" height="387" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;En ese momento en el toolbox veremos el componente WssTaskActivity, pero antes de agregarlo debemos insertar en el flujo de trabajo el componente que realizará la creación de las tareas en paralelo, para lo cual seleccionen el componente replicator y llévenlo hacia el área de trabajo, luego seleccionen WssTaskActivity e insértenlo dentro del replicator.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/008_5F00_34EDB601.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="008" border="0" alt="008" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/008_5F00_thumb_5F00_2A00AEEC.jpg" width="604" height="392" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;La siguiente es la vista del flujo de trabajo con el replicator insertado. Le damos doble clic sobre el componente onWorkflowActivated1, para proceder a inicializar variables.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/009_5F00_582A84D9.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="009" border="0" alt="009" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/009_5F00_thumb_5F00_1B45DD3A.jpg" width="604" height="392" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una vez realizado lo anterior, vamos al código del flujo de trabajo y defina las siguientes variables públicas:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#008000;"&gt;//Contendrá la lista de aprobadores.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IList approversList;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#008000;"&gt;//Bandera que se utilizará para determinar si la tarea actual&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#008000;"&gt;//fue completada o no, por defecto es falso.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; isActualTaskCompleted = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;En este ejemplo quemaremos en el código la lista de aprobadores, pero debemos tener en cuenta que los aprobadores los podemos obtener de cualquier objeto.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; onWorkflowActivated1_Invoked(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, ExternalDataEventArgs e)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;   approversList = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArrayList();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;   approversList.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;igec\\ffagas&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;   approversList.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;igec\\user1a&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;   approversList.Add(&amp;quot;&lt;span style="color:#8b0000;"&gt;igec\\user2a&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;Una vez inicializada la lista de aprobadores regresamos a la vista de diseño del flujo de trabajo y procedemos a configurar las propiedades del replicator, lo primero que debemos hacer es vincular la variable approversList con la propiedad InitialChildData, el replicator utilizará esta lista para la creación de las actividades, veamos al replicator como un foreach, lo que implica que no debemos programar el avance al siguiente elemento de la lista, el replicator permite dos tipos de iteraciones en serie o en paralelo, por defecto está en serie, procedamos a cambiarlo a paralelo. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/010_5F00_0491AB60.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="010" border="0" alt="010" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/010_5F00_thumb_5F00_13E50D6F.jpg" width="514" height="414" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Luego, procedemos a programar los siguientes métodos del replicator, para lo cual en la lista de propiedades ingrese el nombre del método y enter, automáticamente el VS abrirá la vista de código del flujo:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ParallelChildInitialized(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, ReplicatorChildEventArgs e)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;/* Debemos hacer un cast de la actividad que está actualmente instanciada
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;     con la actividad que creamos en el proyecto anterior, para &lt;/p&gt;&lt;p&gt;     poder tener acceso 
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;     a las propiedades públicas de la misma. Estas propiedades &lt;/p&gt;&lt;p&gt;     nos permitirán asignar a un usuario,
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;     la descripción, título, ID (es un GUID), y el campo de estado de la tarea.
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  */&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;//Recuerde que los usuarios a los que se va a asignar la tarea se encuentran en la lista,&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;//entonces debe hacer referencia al dato actualmente instanciado y asignarselo al campo público de la actividad.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  (e.Activity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; BasicTaskActivity.WssTaskActivity).strAsignadoA = e.InstanceData.ToString();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  (e.Activity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; BasicTaskActivity.WssTaskActivity).strDescripcion = &amp;quot;&lt;span style="color:#8b0000;"&gt;Demo Tarea Paralelas&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  (e.Activity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; BasicTaskActivity.WssTaskActivity).strTitulo = &amp;quot;&lt;span style="color:#8b0000;"&gt;Demo Tarea Paralela&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  (e.Activity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; BasicTaskActivity.WssTaskActivity).taskId = Guid.NewGuid();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;  &lt;span style="color:#008000;"&gt;// Para obtener información de una columna de sharepoint la debemos instanciar por su GUID, &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;para lo cual utilizaremos las propiedades del flujo,&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;  &lt;span style="color:#008000;"&gt;// instanciamos la lista de tareas, luego sus campos y le pasamos como &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;parametro el nombre que se muestra en sharepoint&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;  &lt;span style="color:#008000;"&gt;// en este caso me interesa conocer la información del campo estado, y obtengo su ID (GUID) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;que utilizará el WssTaskActivity para obtener la información&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;// del estado actual de la tarea &lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;  (e.Activity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; BasicTaskActivity.WssTaskActivity).idCampoEstado = &lt;/p&gt;&lt;p&gt;workflowProperties.TaskList.Fields[&amp;quot;&lt;span style="color:#8b0000;"&gt;Estado&lt;/span&gt;&amp;quot;].Id;
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ParallelChildCompleted(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, ReplicatorChildEventArgs e)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;// Validamos cada vez que se complete una actividad hija del &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;replicator el estado actual de la tarea&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;// si la tarea fue completada, cambiamos el estado de la &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;variable isActualTaskCompleted a True.&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((e.Activity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; BasicTaskActivity.WssTaskActivity).esTareaCompletada)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.isActualTaskCompleted = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;/*Este método corresponde a la condición del replicator, &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;debe seleccionar en el tipo de condición (Until Condition)
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;código, y luego insertar el siguiente método, y le asignamos &lt;/p&gt;&lt;p&gt;el valor de la variable this.isActualTaskCompleted, con esto
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;cuando un usuario complete la tarea el flujo terminará.
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;*/&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ParallelTasksNotCompleteCondition(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, ConditionalEventArgs e)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            e.Result = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.isActualTaskCompleted;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Una vez realizado lo anterior, compilamos y ejecutamos el flujo de trabajo, esto le abrirá un navegador y deberá inicializar el flujo manualmente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/011_5F00_70A9FC5C.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="011" border="0" alt="011" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/011_5F00_thumb_5F00_0880BDB6.jpg" width="529" height="330" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;

&lt;p&gt;De la lista de flujos de trabajo seleccionamos el que acabamos de publicar y le aparecerá que la operación de inicialización está en proceso.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/012_5F00_24CDFFD6.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="012" border="0" alt="012" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/012_5F00_thumb_5F00_0D534BA5.jpg" width="540" height="337" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;A continuación en el estado del flujo de trabajo veremos que se ha creado las tareas para los usuarios que configuramos en la lista&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/013_5F00_723A7C96.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="013" border="0" alt="013" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/013_5F00_thumb_5F00_0768823F.jpg" width="552" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seleccionamos cualquiera de ellas y editamos su estado&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/014_5F00_78DD604C.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="014" border="0" alt="014" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/014_5F00_thumb_5F00_5FB1E047.jpg" width="554" height="332" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seleccionamos completada. (Tenga en cuenta que si su sharepoint está en español deberá cambiar el código de la tarea personalizada), por lo siguiente:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; cambiaTarea_Invoked(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, ExternalDataEventArgs e)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;p&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; estado = &lt;/p&gt;&lt;p&gt;cambiaTarea_AfterProperties1.ExtendedProperties[idCampoEstado].ToString();
&lt;/p&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (estado != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (estado.Equals(&amp;quot;&lt;span style="color:#8b0000;"&gt;Completada&lt;/span&gt;&amp;quot;))
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.esTareaCompletada = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/015_5F00_7141CB12.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="015" border="0" alt="015" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/015_5F00_thumb_5F00_789D8ABF.jpg" width="673" height="403" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego de completar la tarea el flujo aparecerá con un estado ya no en curso sino en Finalizado.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/016_5F00_5B67BCE8.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="016" border="0" alt="016" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ffagas/016_5F00_thumb_5F00_1DAAAF5F.jpg" width="674" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>REST in WCF </title><link>http://msmvps.com/blogs/abu/archive/2008/12/23/rest-in-wcf.aspx</link><pubDate>Tue, 23 Dec 2008 06:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1657547</guid><dc:creator>abu</dc:creator><description>&lt;p&gt;The series blog post on REST in WCF
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/05/28/rest-in-wcf-part-i-rest-overview.aspx"&gt;REST in WCF - Part I (REST Overview)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/05/29/rest-in-wcf-part-ii-ajax-friendly-services-creating-the-service.aspx"&gt;REST in WCF - Part II (AJAX Friendly Services, Creating The Service)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/05/30/rest-in-wcf-part-iii-ajax-friendly-services-consuming-the-service.aspx"&gt;REST in WCF - Part III (AJAX Friendly Services, Consuming The Service)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/06/09/rest-in-wcf-part-iv-hi-rest-exposing-a-service-via-get-configuring-the-service.aspx"&gt;REST in WCF - Part IV (HI-REST - Exposing a service via GET - Configuring the service)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/06/10/rest-in-wcf-part-v-hi-rest-exposing-a-service-via-get-the-servicecontract-and-implementation.aspx"&gt;REST in WCF - Part V (HI-REST - Exposing a service via GET - The ServiceContract and Implementation)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/06/12/rest-in-wcf-part-vi-hi-rest-consuming-our-get-service-via-ajax.aspx"&gt;REST in WCF - Part VI (HI-REST - Consuming our GET service via AJAX)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/06/12/rest-in-wcf-part-vii-hi-rest-implementing-insert-and-update.aspx"&gt;REST in WCF - Part VII (HI-REST - Implementing Insert and Update&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/06/14/rest-in-wcf-part-viii-hi-rest-implementing-delete.aspx"&gt;REST in WCF - Part VIII (HI-REST - Implementing Delete)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/08/22/rest-in-wcf-part-ix-controlling-the-uri.aspx"&gt;REST in WCF - Part IX - Controlling the URI&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/bags/archive/2008/08/28/rest-in-wcf-part-x-supporting-caching-and-conditional-get.aspx"&gt;REST in WCF - Part X - Supporting Caching and Conditional GET&lt;/a&gt; &lt;/li&gt;
&lt;/p&gt;</description></item><item><title>Microsoft Enterprise Library 4.1 – October 2008</title><link>http://msmvps.com/blogs/ffagas/archive/2008/11/01/microsoft-enterprise-library-4-1-october-2008.aspx</link><pubDate>Sat, 01 Nov 2008 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652734</guid><dc:creator>ffagas</dc:creator><description>&lt;p&gt;Estoy un poquito desactualizado con la escritura en mi blog, pero para quienes están interesados y trabajan con Enterprise Library, este mes Microsoft libreró una nueva versión de la misma para .Net Framework 2.5 y VS 2008, la cual pueden descargar &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=1643758B-2986-47F7-B529-3E41584B6CE5&amp;amp;displaylang=en"&gt;aquí&lt;/a&gt;. Para conocer más sobre este release visiten este &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/dd203099.aspx"&gt;sitio&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>