<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>ASP.NET</title><link>http://blogs.clearscreen.com/nandy/category/175.aspx</link><description>ASP.NET</description><managingEditor>Fernando Cortés Hierro</managingEditor><dc:language>es-ES</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Las Cosas Claras: Desde Javascript interactuar con Silverlight</title><link>http://blogs.clearscreen.com/nandy/archive/2008/07/04/12803.aspx</link><pubDate>Fri, 04 Jul 2008 01:09:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2008/07/04/12803.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/12803.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2008/07/04/12803.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/12803.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/12803.aspx</trackback:ping><description>&lt;p&gt;En el último post de la serie esta que comencé de "Las Cosas Claras" estuvimos viendo como podíamos acceder al DOM del explorador para, en el ejemplo, llamar a funciones javascript. Pues bien, hoy veremos como hacer precisamente lo contrario.&lt;/p&gt; &lt;p&gt;En el siguiente ejemplo veremos como desde javascript podemos provocar cambios en el Silverlight, en este caso cambiar la orientación de los elementos de un &lt;strong&gt;StackPanel&lt;/strong&gt;, pero también podríamos provocar el inicio de una animación o pararla, etc.&lt;/p&gt; &lt;p&gt;En primer lugar utilizaremos el siguiente namespace ya que contiene lo necesario para realizar esto:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Browser;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Centrándonos en la página principal del Silverlight &lt;em&gt;Page.xaml&lt;/em&gt;. El código XAML será muy sencillo, un simple StackPanel con varios botones:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="LayoutRoot" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="White"&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Rojo" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Red"/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Verde" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Green"/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Azul" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Blue"/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Amarillo" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Yellow"/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Blanco" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="White"/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Negro" &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Black"/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Y en el código fuente debemos registrar la clase &lt;strong&gt;MiTipoScriptable&lt;/strong&gt; para poderla usar desde javascript de la siguiente manera:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En el evento Loaded de la página registraremos el objeto que será usados para acceder desde javascript al método. &lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;HtmlPage&lt;/span&gt;.RegisterScriptableObject(&lt;span style="color: #a31515"&gt;"slObject"&lt;/span&gt;, &lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Y por último decoraremos un método de la clase &lt;strong&gt;Page,&lt;/strong&gt; donde hemos realizado el registro del objeto del punto anterior, con el decorador [&lt;span style="color: #2b91af"&gt;ScriptableMember&lt;/span&gt;] el cual será el método al que podremos llamar desde javascript. &lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;ScriptableMember&lt;/span&gt;]
&lt;span style="color: blue"&gt;public void &lt;/span&gt;slMethod(&lt;span style="color: blue"&gt;string &lt;/span&gt;o)
{
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(o != &lt;span style="color: #a31515"&gt;"H"&lt;/span&gt;)
        LayoutRoot.Orientation = &lt;span style="color: #2b91af"&gt;Orientation&lt;/span&gt;.Vertical;
    &lt;span style="color: blue"&gt;else
        &lt;/span&gt;LayoutRoot.Orientation = &lt;span style="color: #2b91af"&gt;Orientation&lt;/span&gt;.Horizontal;
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Ahora nos vamos a la página ASPX desde la cual llamaremos al método &lt;strong&gt;slMethod &lt;/strong&gt;del Silverlight. Para esto en primer lugar obtendremos el contenedor del Silverlight el cual en nuestro caso del ejemplo se llama &lt;strong&gt;SilverlightContainer &lt;/strong&gt;y por último accederemos al método registrado mediante la siguiente sintaxis:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;function &lt;/span&gt;Orientacion(oo)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;slPlugin = $get(&lt;span style="color: #a31515"&gt;"SilverlightContainer"&lt;/span&gt;);
     
    slPlugin.Content.slObject.slMethod(oo);
}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;PD: Se han creado dos botones &lt;em&gt;Vertical&lt;/em&gt; y &lt;em&gt;Horizontal&lt;/em&gt; que llamarán a la función &lt;strong&gt;Orientacion&lt;/strong&gt; para cambiar el tipo de orientación del StackPanel.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="Stackpanel" src="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel_thumb.jpg" width="430" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="461" alt="Stackpanel2" src="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel2_thumb.jpg" width="430" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/12803.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>En el último post de la serie esta que comencé de "Las Cosas Claras" estuvimos viendo como podíamos acceder al DOM del explorador para, en el ejemplo, llamar a funciones javascript. Pues bien, hoy veremos como hacer precisamente lo contrario.</p> <p>En el siguiente ejemplo veremos como desde javascript podemos provocar cambios en el Silverlight, en este caso cambiar la orientación de los elementos de un <strong>StackPanel</strong>, pero también podríamos provocar el inicio de una animación o pararla, etc.</p> <p>En primer lugar utilizaremos el siguiente namespace ya que contiene lo necesario para realizar esto:</p><pre class="code"><span style="color: blue">using </span>System.Windows.Browser;</pre>
<p> </p>
<p>Centrándonos en la página principal del Silverlight <em>Page.xaml</em>. El código XAML será muy sencillo, un simple StackPanel con varios botones:</p><pre class="code"><span style="color: blue">    &lt;</span><span style="color: #a31515">StackPanel </span><span style="color: red">x</span><span style="color: blue">:</span><span style="color: red">Name</span><span style="color: blue">="LayoutRoot" </span><span style="color: red">Background</span><span style="color: blue">="White"&gt;
        &lt;</span><span style="color: #a31515">Button </span><span style="color: red">Content</span><span style="color: blue">="Rojo" </span><span style="color: red">Background</span><span style="color: blue">="Red"/&gt;
        &lt;</span><span style="color: #a31515">Button </span><span style="color: red">Content</span><span style="color: blue">="Verde" </span><span style="color: red">Background</span><span style="color: blue">="Green"/&gt;
        &lt;</span><span style="color: #a31515">Button </span><span style="color: red">Content</span><span style="color: blue">="Azul" </span><span style="color: red">Background</span><span style="color: blue">="Blue"/&gt;
        &lt;</span><span style="color: #a31515">Button </span><span style="color: red">Content</span><span style="color: blue">="Amarillo" </span><span style="color: red">Background</span><span style="color: blue">="Yellow"/&gt;
        &lt;</span><span style="color: #a31515">Button </span><span style="color: red">Content</span><span style="color: blue">="Blanco" </span><span style="color: red">Background</span><span style="color: blue">="White"/&gt;
        &lt;</span><span style="color: #a31515">Button </span><span style="color: red">Content</span><span style="color: blue">="Negro" </span><span style="color: red">Background</span><span style="color: blue">="Black"/&gt;
    &lt;/</span><span style="color: #a31515">StackPanel</span><span style="color: blue">&gt;</span></pre><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a>
<p>Y en el código fuente debemos registrar la clase <strong>MiTipoScriptable</strong> para poderla usar desde javascript de la siguiente manera:</p>
<ul>
<li>En el evento Loaded de la página registraremos el objeto que será usados para acceder desde javascript al método. </li></ul>
<blockquote><pre class="code"><span style="color: #2b91af">HtmlPage</span>.RegisterScriptableObject(<span style="color: #a31515">"slObject"</span>, <span style="color: blue">this</span>);</pre></blockquote><a href="http://11011.net/software/vspaste"></a>
<ul>
<li>Y por último decoraremos un método de la clase <strong>Page,</strong> donde hemos realizado el registro del objeto del punto anterior, con el decorador [<span style="color: #2b91af">ScriptableMember</span>] el cual será el método al que podremos llamar desde javascript. </li></ul>
<blockquote><pre class="code">[<span style="color: #2b91af">ScriptableMember</span>]
<span style="color: blue">public void </span>slMethod(<span style="color: blue">string </span>o)
{
    <span style="color: blue">if </span>(o != <span style="color: #a31515">"H"</span>)
        LayoutRoot.Orientation = <span style="color: #2b91af">Orientation</span>.Vertical;
    <span style="color: blue">else
        </span>LayoutRoot.Orientation = <span style="color: #2b91af">Orientation</span>.Horizontal;
}</pre></blockquote>
<p>Ahora nos vamos a la página ASPX desde la cual llamaremos al método <strong>slMethod </strong>del Silverlight. Para esto en primer lugar obtendremos el contenedor del Silverlight el cual en nuestro caso del ejemplo se llama <strong>SilverlightContainer </strong>y por último accederemos al método registrado mediante la siguiente sintaxis:</p><pre class="code"><span style="color: blue">function </span>Orientacion(oo)
{
    <span style="color: blue">var </span>slPlugin = $get(<span style="color: #a31515">"SilverlightContainer"</span>);
     
    slPlugin.Content.slObject.slMethod(oo);
}</pre>
<p><a href="http://11011.net/software/vspaste"></a>PD: Se han creado dos botones <em>Vertical</em> y <em>Horizontal</em> que llamarán a la función <strong>Orientacion</strong> para cambiar el tipo de orientación del StackPanel.</p>
<p><a href="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="Stackpanel" src="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel_thumb.jpg" width="430" border="0" /></a> </p>
<p><a href="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="461" alt="Stackpanel2" src="http://images.fernandocortes.net/LasCosasClarasDesdeJavascriptinteractuar_EDFD/Stackpanel2_thumb.jpg" width="430" border="0" /></a></p><img src ="http://blogs.clearscreen.com/nandy/aggbug/12803.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Las Cosas Claras: Llamar funciones javascript desde Silverlight</title><link>http://blogs.clearscreen.com/nandy/archive/2008/06/27/12223.aspx</link><pubDate>Fri, 27 Jun 2008 03:28:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2008/06/27/12223.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/12223.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2008/06/27/12223.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/12223.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/12223.aspx</trackback:ping><description>&lt;p&gt;Hoy veremos algo que nos puede resultar muy útil en nuestras aplicaciones Silverlight. Estamos hablando de la posibilidad de acceder al DOM (Document Object Model) del navegador para llamar a una función javascript que hará lo que queramos en el cliente.&lt;/p&gt; &lt;p&gt;Para ello necesitamos en primer lugar usar el siguiente Namespace:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Browser;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;En este namespace disponemos de la clase &lt;strong&gt;HtmlPage&lt;/strong&gt; que será la que nos permita tener el acceso necesario al DOM del navegador. &lt;/p&gt;
&lt;p&gt;Para este post he montado en un momentillo un ejemplo muy fácil. Son dos botones y una caja de texto. El primer botón llama a una función que muestra un alert con un mensaje predefinido en el cliente y el segundo botón muestra un alert con el texto del TextBox como mensaje. Algo sencillo pero que muestra lo más básico que podemos hacer: Llamar a una función con y sin parámetros.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Sltobrowser.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="191" alt="Sltobrowser" src="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Sltobrowser_thumb.jpg" width="489" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;En el código fuente podemos ver como utilizando el método &lt;strong&gt;GetProperty&lt;/strong&gt; al que se le pasa el nombre de la función javascript, obtenemos un objeto de tipo &lt;strong&gt;ScriptObject&lt;/strong&gt;. Este tipo de objeto dispone del método &lt;strong&gt;InvokeSelf&lt;/strong&gt; que se encarga de hacer la llamada a la función en cuestión. Este método recibirá los parámetros que le serán pasados a la función javascript.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;bttLaunch_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    &lt;span style="color: #2b91af"&gt;ScriptObject &lt;/span&gt;scriptMethod = (&lt;span style="color: #2b91af"&gt;ScriptObject&lt;/span&gt;)&lt;span style="color: #2b91af"&gt;HtmlPage&lt;/span&gt;.Window.GetProperty(&lt;span style="color: #a31515"&gt;"MostrarAlerta"&lt;/span&gt;);
    scriptMethod.InvokeSelf();
}

&lt;span style="color: blue"&gt;private void &lt;/span&gt;bttLaunch2_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    &lt;span style="color: #2b91af"&gt;ScriptObject &lt;/span&gt;scriptMethod = (&lt;span style="color: #2b91af"&gt;ScriptObject&lt;/span&gt;)&lt;span style="color: #2b91af"&gt;HtmlPage&lt;/span&gt;.Window.GetProperty(&lt;span style="color: #a31515"&gt;"MostrarAlerta2"&lt;/span&gt;);
    scriptMethod.InvokeSelf(txtMessage.Text);
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Un muestra del resultado por ejemplo al pulsar el segundo botón seria el siguiente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Capture.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="389" alt="Capture" src="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Capture_thumb.jpg" width="528" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;En el siguiente post de esta serie veremos como hacer lo contrario. Llamar desde el cliente, el navegador, a un función del Silverlight.&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/12223.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Hoy veremos algo que nos puede resultar muy útil en nuestras aplicaciones Silverlight. Estamos hablando de la posibilidad de acceder al DOM (Document Object Model) del navegador para llamar a una función javascript que hará lo que queramos en el cliente.</p> <p>Para ello necesitamos en primer lugar usar el siguiente Namespace:</p><pre class="code"><span style="color: blue">using </span>System.Windows.Browser;</pre><a href="http://11011.net/software/vspaste"></a>
<p>En este namespace disponemos de la clase <strong>HtmlPage</strong> que será la que nos permita tener el acceso necesario al DOM del navegador. </p>
<p>Para este post he montado en un momentillo un ejemplo muy fácil. Son dos botones y una caja de texto. El primer botón llama a una función que muestra un alert con un mensaje predefinido en el cliente y el segundo botón muestra un alert con el texto del TextBox como mensaje. Algo sencillo pero que muestra lo más básico que podemos hacer: Llamar a una función con y sin parámetros.</p>
<p><a href="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Sltobrowser.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="191" alt="Sltobrowser" src="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Sltobrowser_thumb.jpg" width="489" border="0" /></a> </p>
<p>En el código fuente podemos ver como utilizando el método <strong>GetProperty</strong> al que se le pasa el nombre de la función javascript, obtenemos un objeto de tipo <strong>ScriptObject</strong>. Este tipo de objeto dispone del método <strong>InvokeSelf</strong> que se encarga de hacer la llamada a la función en cuestión. Este método recibirá los parámetros que le serán pasados a la función javascript.</p><pre class="code"><span style="color: blue">private void </span>bttLaunch_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">RoutedEventArgs </span>e)
{
    <span style="color: #2b91af">ScriptObject </span>scriptMethod = (<span style="color: #2b91af">ScriptObject</span>)<span style="color: #2b91af">HtmlPage</span>.Window.GetProperty(<span style="color: #a31515">"MostrarAlerta"</span>);
    scriptMethod.InvokeSelf();
}

<span style="color: blue">private void </span>bttLaunch2_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">RoutedEventArgs </span>e)
{
    <span style="color: #2b91af">ScriptObject </span>scriptMethod = (<span style="color: #2b91af">ScriptObject</span>)<span style="color: #2b91af">HtmlPage</span>.Window.GetProperty(<span style="color: #a31515">"MostrarAlerta2"</span>);
    scriptMethod.InvokeSelf(txtMessage.Text);
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>Un muestra del resultado por ejemplo al pulsar el segundo botón seria el siguiente:</p>
<p><a href="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Capture.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="389" alt="Capture" src="http://images.fernandocortes.net/SilverlightBeta2Llamarfuncionesjavascrip_FBA4/Capture_thumb.jpg" width="528" border="0" /></a> </p>
<p>En el siguiente post de esta serie veremos como hacer lo contrario. Llamar desde el cliente, el navegador, a un función del Silverlight.</p><img src ="http://blogs.clearscreen.com/nandy/aggbug/12223.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Twitter desde Silverlight Beta 2</title><link>http://blogs.clearscreen.com/nandy/archive/2008/06/20/12060.aspx</link><pubDate>Fri, 20 Jun 2008 04:26:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2008/06/20/12060.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/12060.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2008/06/20/12060.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/12060.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/12060.aspx</trackback:ping><description>&lt;p&gt;Fácilmente! Esa es la forma en la que podemos obtener desde Silverlight Beta 2 nuestro post en Twitter. Este nos provee de una forma de obtener en diferentes formatos, nuestros últimos post y más información.&lt;/p&gt; &lt;p&gt;Con la siguiente URL: &lt;a title="http://twitter.com/statuses/user_timeline/{0}.xml" href="http://twitter.com/statuses/user_timeline/USERNAME.xml"&gt;http://twitter.com/statuses/user_timeline/USERNAME.xml&lt;/a&gt; podemos obtener en formato XML los post y más información. Solo decir que debemos autenticarnos para poder recibir esta información.&lt;/p&gt; &lt;p&gt;Twitter provee los siguientes formatos: RSS, XML y JSON&lt;/p&gt; &lt;p&gt;Para más información sobre códigos de error posibles, limitaciones de uso, etc: &lt;a href="http://groups.google.com/group/twitter-development-talk/web/api-documentation#HTTPRequests" target="_blank"&gt;Twitter API Documentation&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En el ejemplo de hoy vamos a consumir el último mensaje del usuario de este blog &lt;em&gt;FernandoBlog&lt;/em&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="204" alt="TwitterSL" src="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL_thumb.jpg" width="338" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Para ello crearemos en primer lugar una aplicación Silverlight hospedada en un Sitio Web también creado en el mismo momento. De la forma en la que lo haremos, crearemos un servicio WCF que expondrá un método de obtención de los mensajes del usuario. En la siguiente imagen se puede ver las clases que necesitaremos para tal servicio:&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL4.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="266" alt="TwitterSL4" src="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL4_thumb.jpg" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt;: Expone el contrato del servicio. En este caso dos métodos para obtener los mensajes del usuario identificado y otro para obtener los mensajes de un usuario a cuyos mensajes tenga acceso el usuario identificado.  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;TwitterHelper&lt;/strong&gt;: Es la clase que realiza la petición HTTP al API de Twitter y donde se procesan los datos recibidos &lt;/li&gt;&lt;/ul&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;TwitterPost&lt;/span&gt;&amp;gt; GetRequest(&lt;span style="color: blue"&gt;string &lt;/span&gt;uri)
{
    &lt;span style="color: #2b91af"&gt;WebRequest &lt;/span&gt;request = &lt;span style="color: #2b91af"&gt;HttpWebRequest&lt;/span&gt;.Create(uri);

    &lt;span style="color: blue"&gt;if &lt;/span&gt;(!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(_ttUser) &amp;amp;&amp;amp; !&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(_ttPwd))
    {
        request.Credentials = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NetworkCredential&lt;/span&gt;(_ttUser, _ttPwd);
    }

    &lt;span style="color: #2b91af"&gt;WebResponse &lt;/span&gt;res = request.GetResponse();
    &lt;span style="color: #2b91af"&gt;StreamReader &lt;/span&gt;stream = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(res.GetResponseStream());
    &lt;span style="color: #2b91af"&gt;TextReader &lt;/span&gt;reader = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringReader&lt;/span&gt;(stream.ReadToEnd());

    &lt;span style="color: #2b91af"&gt;XDocument &lt;/span&gt;xDoc = &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Load(reader);

    &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;from &lt;/span&gt;post &lt;span style="color: blue"&gt;in &lt;/span&gt;xDoc.Descendants(&lt;span style="color: #a31515"&gt;"statuses"&lt;/span&gt;).Descendants(&lt;span style="color: #a31515"&gt;"status"&lt;/span&gt;)
           &lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TwitterPost
           &lt;/span&gt;{
               Id = post.Element(&lt;span style="color: #a31515"&gt;"id"&lt;/span&gt;).Value,
               CreatedAt = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.ParseExact(post.Element(&lt;span style="color: #a31515"&gt;"created_at"&lt;/span&gt;).Value, &lt;span style="color: #a31515"&gt;"ddd MMM dd HH:mm:ss zzzzz yyyy"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;CultureInfo&lt;/span&gt;.InvariantCulture, &lt;span style="color: #2b91af"&gt;DateTimeStyles&lt;/span&gt;.AssumeLocal),
               Text = &lt;span style="color: #2b91af"&gt;HttpUtility&lt;/span&gt;.HtmlDecode(post.Element(&lt;span style="color: #a31515"&gt;"text"&lt;/span&gt;).Value)
           }).ToList&amp;lt;&lt;span style="color: #2b91af"&gt;TwitterPost&lt;/span&gt;&amp;gt;();
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TwitterPost&lt;/strong&gt;: Representa un mensaje de twitter. El API devuelve mucha información que para este ejemplo solo con el Identificador, el texto del mensaje y la fecha de la creación del mismo nos es suficiente. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;En la parte de Silverlight simplemente añadiremos una referencia la servicio WCF creado y haremos una llamada al método correspondiente.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;Page()
{
    InitializeComponent();
    &lt;span style="color: #2b91af"&gt;ServiceClient &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceClient&lt;/span&gt;();
    client.TwitterPostsCompleted += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;TwitterPostsCompletedEventArgs&lt;/span&gt;&amp;gt;(client_TwitterPostsCompleted);
    client.TwitterPostsAsync();
}

&lt;span style="color: blue"&gt;private void &lt;/span&gt;client_TwitterPostsCompleted(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;TwitterPostsCompletedEventArgs &lt;/span&gt;e)
{
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;TwitterPost&lt;/span&gt;&amp;gt; twitter = e.Result;
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(twitter.Count &amp;gt; 0)
    {
        &lt;span style="color: #2b91af"&gt;TwitterPost &lt;/span&gt;lastTwitter = (&lt;span style="color: blue"&gt;from &lt;/span&gt;post &lt;span style="color: blue"&gt;in &lt;/span&gt;twitter &lt;span style="color: blue"&gt;orderby &lt;/span&gt;post.CreatedAt &lt;span style="color: blue"&gt;descending select &lt;/span&gt;post).First();
        txtPost.Text = lastTwitter.Text;
        txtTime.Text = RelativeCreatedAt(lastTwitter.CreatedAt);
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Como curiosidad se muestra la función utilizada para mostrar la fecha de creación del mensaje en relación al día en la que se obtiene el mensaje desde Silverlight:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;RelativeCreatedAt(&lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;_createAt)
{
    &lt;span style="color: #2b91af"&gt;TimeSpan &lt;/span&gt;_time = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.Subtract(_createAt);

    &lt;span style="color: blue"&gt;int &lt;/span&gt;_days = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToInt32(_time.TotalDays);
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(_days &amp;gt; 0) &lt;span style="color: blue"&gt;return string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"Hace {0} dia{1}"&lt;/span&gt;, _days, _days &amp;gt; 1 ? &lt;span style="color: #a31515"&gt;"s" &lt;/span&gt;: &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);

    &lt;span style="color: blue"&gt;int &lt;/span&gt;_hours = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToInt32(_time.TotalHours);
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(_hours &amp;gt; 0) &lt;span style="color: blue"&gt;return string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"Hace {0} hora{1}"&lt;/span&gt;, _hours, _hours &amp;gt; 1 ? &lt;span style="color: #a31515"&gt;"s" &lt;/span&gt;: &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);

    &lt;span style="color: blue"&gt;int &lt;/span&gt;_minutes = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToInt32(_time.TotalMinutes);
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(_minutes &amp;gt; 0) &lt;span style="color: blue"&gt;return string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"Hace {0} minuto{1}"&lt;/span&gt;, _minutes, _minutes &amp;gt; 1 ? &lt;span style="color: #a31515"&gt;"s" &lt;/span&gt;: &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);

    &lt;span style="color: blue"&gt;int &lt;/span&gt;_seconds = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToInt32(_time.TotalSeconds);
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(_seconds &amp;lt; 0) _seconds = 0;
    &lt;span style="color: blue"&gt;return string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"Hace {0} segundo{1}"&lt;/span&gt;, _seconds, (_seconds &amp;gt; 1 || _seconds == 0) ? &lt;span style="color: #a31515"&gt;"s" &lt;/span&gt;: &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Finalmente el resultado sería el siguiente.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="TwitterSL2" src="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL2_thumb.jpg" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/12060.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Fácilmente! Esa es la forma en la que podemos obtener desde Silverlight Beta 2 nuestro post en Twitter. Este nos provee de una forma de obtener en diferentes formatos, nuestros últimos post y más información.</p> <p>Con la siguiente URL: <a title="http://twitter.com/statuses/user_timeline/{0}.xml" href="http://twitter.com/statuses/user_timeline/USERNAME.xml">http://twitter.com/statuses/user_timeline/USERNAME.xml</a> podemos obtener en formato XML los post y más información. Solo decir que debemos autenticarnos para poder recibir esta información.</p> <p>Twitter provee los siguientes formatos: RSS, XML y JSON</p> <p>Para más información sobre códigos de error posibles, limitaciones de uso, etc: <a href="http://groups.google.com/group/twitter-development-talk/web/api-documentation#HTTPRequests" target="_blank">Twitter API Documentation</a></p> <p>En el ejemplo de hoy vamos a consumir el último mensaje del usuario de este blog <em>FernandoBlog</em>. </p> <p><a href="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="204" alt="TwitterSL" src="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL_thumb.jpg" width="338" border="0" /></a> </p> <p>Para ello crearemos en primer lugar una aplicación Silverlight hospedada en un Sitio Web también creado en el mismo momento. De la forma en la que lo haremos, crearemos un servicio WCF que expondrá un método de obtención de los mensajes del usuario. En la siguiente imagen se puede ver las clases que necesitaremos para tal servicio:</p> <p><a href="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL4.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="266" alt="TwitterSL4" src="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL4_thumb.jpg" width="644" border="0" /></a> </p> <ul> <li><strong>Service</strong>: Expone el contrato del servicio. En este caso dos métodos para obtener los mensajes del usuario identificado y otro para obtener los mensajes de un usuario a cuyos mensajes tenga acceso el usuario identificado.  </li><li><strong>TwitterHelper</strong>: Es la clase que realiza la petición HTTP al API de Twitter y donde se procesan los datos recibidos </li></ul> <blockquote><pre class="code"><span style="color: blue">private </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">TwitterPost</span>&gt; GetRequest(<span style="color: blue">string </span>uri)
{
    <span style="color: #2b91af">WebRequest </span>request = <span style="color: #2b91af">HttpWebRequest</span>.Create(uri);

    <span style="color: blue">if </span>(!<span style="color: blue">string</span>.IsNullOrEmpty(_ttUser) &amp;&amp; !<span style="color: blue">string</span>.IsNullOrEmpty(_ttPwd))
    {
        request.Credentials = <span style="color: blue">new </span><span style="color: #2b91af">NetworkCredential</span>(_ttUser, _ttPwd);
    }

    <span style="color: #2b91af">WebResponse </span>res = request.GetResponse();
    <span style="color: #2b91af">StreamReader </span>stream = <span style="color: blue">new </span><span style="color: #2b91af">StreamReader</span>(res.GetResponseStream());
    <span style="color: #2b91af">TextReader </span>reader = <span style="color: blue">new </span><span style="color: #2b91af">StringReader</span>(stream.ReadToEnd());

    <span style="color: #2b91af">XDocument </span>xDoc = <span style="color: #2b91af">XDocument</span>.Load(reader);

    <span style="color: blue">return </span>(<span style="color: blue">from </span>post <span style="color: blue">in </span>xDoc.Descendants(<span style="color: #a31515">"statuses"</span>).Descendants(<span style="color: #a31515">"status"</span>)
           <span style="color: blue">select new </span><span style="color: #2b91af">TwitterPost
           </span>{
               Id = post.Element(<span style="color: #a31515">"id"</span>).Value,
               CreatedAt = <span style="color: #2b91af">DateTime</span>.ParseExact(post.Element(<span style="color: #a31515">"created_at"</span>).Value, <span style="color: #a31515">"ddd MMM dd HH:mm:ss zzzzz yyyy"</span>, <span style="color: #2b91af">CultureInfo</span>.InvariantCulture, <span style="color: #2b91af">DateTimeStyles</span>.AssumeLocal),
               Text = <span style="color: #2b91af">HttpUtility</span>.HtmlDecode(post.Element(<span style="color: #a31515">"text"</span>).Value)
           }).ToList&lt;<span style="color: #2b91af">TwitterPost</span>&gt;();
}</pre></blockquote><a href="http://11011.net/software/vspaste"></a>
<ul>
<li><strong>TwitterPost</strong>: Representa un mensaje de twitter. El API devuelve mucha información que para este ejemplo solo con el Identificador, el texto del mensaje y la fecha de la creación del mismo nos es suficiente. </li></ul>
<p> </p>
<p>En la parte de Silverlight simplemente añadiremos una referencia la servicio WCF creado y haremos una llamada al método correspondiente.</p><pre class="code"><span style="color: blue">public </span>Page()
{
    InitializeComponent();
    <span style="color: #2b91af">ServiceClient </span>client = <span style="color: blue">new </span><span style="color: #2b91af">ServiceClient</span>();
    client.TwitterPostsCompleted += <span style="color: blue">new </span><span style="color: #2b91af">EventHandler</span>&lt;<span style="color: #2b91af">TwitterPostsCompletedEventArgs</span>&gt;(client_TwitterPostsCompleted);
    client.TwitterPostsAsync();
}

<span style="color: blue">private void </span>client_TwitterPostsCompleted(<span style="color: blue">object </span>sender, <span style="color: #2b91af">TwitterPostsCompletedEventArgs </span>e)
{
    <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">TwitterPost</span>&gt; twitter = e.Result;
    <span style="color: blue">if </span>(twitter.Count &gt; 0)
    {
        <span style="color: #2b91af">TwitterPost </span>lastTwitter = (<span style="color: blue">from </span>post <span style="color: blue">in </span>twitter <span style="color: blue">orderby </span>post.CreatedAt <span style="color: blue">descending select </span>post).First();
        txtPost.Text = lastTwitter.Text;
        txtTime.Text = RelativeCreatedAt(lastTwitter.CreatedAt);
    }
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>Como curiosidad se muestra la función utilizada para mostrar la fecha de creación del mensaje en relación al día en la que se obtiene el mensaje desde Silverlight:</p><pre class="code"><span style="color: blue">private string </span>RelativeCreatedAt(<span style="color: #2b91af">DateTime </span>_createAt)
{
    <span style="color: #2b91af">TimeSpan </span>_time = <span style="color: #2b91af">DateTime</span>.Now.Subtract(_createAt);

    <span style="color: blue">int </span>_days = <span style="color: #2b91af">Convert</span>.ToInt32(_time.TotalDays);
    <span style="color: blue">if </span>(_days &gt; 0) <span style="color: blue">return string</span>.Format(<span style="color: #a31515">"Hace {0} dia{1}"</span>, _days, _days &gt; 1 ? <span style="color: #a31515">"s" </span>: <span style="color: #a31515">""</span>);

    <span style="color: blue">int </span>_hours = <span style="color: #2b91af">Convert</span>.ToInt32(_time.TotalHours);
    <span style="color: blue">if </span>(_hours &gt; 0) <span style="color: blue">return string</span>.Format(<span style="color: #a31515">"Hace {0} hora{1}"</span>, _hours, _hours &gt; 1 ? <span style="color: #a31515">"s" </span>: <span style="color: #a31515">""</span>);

    <span style="color: blue">int </span>_minutes = <span style="color: #2b91af">Convert</span>.ToInt32(_time.TotalMinutes);
    <span style="color: blue">if </span>(_minutes &gt; 0) <span style="color: blue">return string</span>.Format(<span style="color: #a31515">"Hace {0} minuto{1}"</span>, _minutes, _minutes &gt; 1 ? <span style="color: #a31515">"s" </span>: <span style="color: #a31515">""</span>);

    <span style="color: blue">int </span>_seconds = <span style="color: #2b91af">Convert</span>.ToInt32(_time.TotalSeconds);
    <span style="color: blue">if </span>(_seconds &lt; 0) _seconds = 0;
    <span style="color: blue">return string</span>.Format(<span style="color: #a31515">"Hace {0} segundo{1}"</span>, _seconds, (_seconds &gt; 1 || _seconds == 0) ? <span style="color: #a31515">"s" </span>: <span style="color: #a31515">""</span>);
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>Finalmente el resultado sería el siguiente.</p>
<p><a href="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL2.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="TwitterSL2" src="http://images.fernandocortes.net/TwitterdesdeSilverlightBeta2_10BA2/TwitterSL2_thumb.jpg" width="644" border="0" /></a></p><img src ="http://blogs.clearscreen.com/nandy/aggbug/12060.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Silverlight Beta2: CrossDomain</title><link>http://blogs.clearscreen.com/nandy/archive/2008/06/16/12018.aspx</link><pubDate>Mon, 16 Jun 2008 06:56:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2008/06/16/12018.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/12018.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2008/06/16/12018.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/12018.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/12018.aspx</trackback:ping><description>&lt;p&gt;Hasta la salida de la Beta 2 de Silverlight, cuando queríamos con la Beta 1 realizar una llamada un Servicio Web o WCF sabíamos que debíamos de colorar los ficheros Crossdomain.xml o ClientAccessPolicy.xml en el raíz del Sitio Web donde estuviese el Servicio a consumir por Silverlight. Silverlight por defecto irá a buscar el fichero ClientAccessPolicy.xml y sino lo encuentra buscará el Crossdomain.xml&lt;/p&gt;
&lt;p&gt;Si hacemos pruebas desde Silverlight Beta2, nos encontraremos que aun teniendo estos ficheros, recibimos el siguiente error depurando:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.clearscreen.com/nandy/admin/$SLBeta2WS3.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="226" alt="SLBeta2WS" src="http://www.fernandocortes.net/image.axd?picture=WindowsLiveWriter/SilverlightBeta2Crossdomain_12FF3/SLBeta2WS.jpg" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;El formato del fichero &lt;strong&gt;ClientAccessPolicy.xml&lt;/strong&gt; que teníamos hasta ahora con el que conseguíamos que funcionase era:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;xml &lt;/span&gt;&lt;span style="COLOR: red"&gt;version&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;1.0&lt;/span&gt;" &lt;span style="COLOR: red"&gt;encoding&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;utf-8&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;access-policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;cross-domain-access&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;allow-from&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;domain &lt;/span&gt;&lt;span style="COLOR: red"&gt;uri&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;*&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;allow-from&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;grant-to&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;resource &lt;/span&gt;&lt;span style="COLOR: red"&gt;path&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&lt;/span&gt;" &lt;span style="COLOR: red"&gt;include-subpaths&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;grant-to&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;cross-domain-access&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;access-policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Pero para esta versión necesitamos realizar un sutil cambio en el fichero:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;xml &lt;/span&gt;&lt;span style="COLOR: red"&gt;version&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;1.0&lt;/span&gt;" &lt;span style="COLOR: red"&gt;encoding&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;utf-8&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;access-policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;cross-domain-access&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;allow-from &lt;/span&gt;&lt;strong&gt;&lt;span style="COLOR: red"&gt;http-request-headers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;*&lt;/span&gt;"&lt;/strong&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;domain &lt;/span&gt;&lt;span style="COLOR: red"&gt;uri&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;*&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;allow-from&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;grant-to&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;resource &lt;/span&gt;&lt;span style="COLOR: red"&gt;path&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&lt;/span&gt;" &lt;span style="COLOR: red"&gt;include-subpaths&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;grant-to&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;cross-domain-access&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;access-policy&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Ahora si que funciona nuestro Silverlight.&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/12018.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Hasta la salida de la Beta 2 de Silverlight, cuando queríamos con la Beta 1 realizar una llamada un Servicio Web o WCF sabíamos que debíamos de colorar los ficheros Crossdomain.xml o ClientAccessPolicy.xml en el raíz del Sitio Web donde estuviese el Servicio a consumir por Silverlight. Silverlight por defecto irá a buscar el fichero ClientAccessPolicy.xml y sino lo encuentra buscará el Crossdomain.xml</p>
<p>Si hacemos pruebas desde Silverlight Beta2, nos encontraremos que aun teniendo estos ficheros, recibimos el siguiente error depurando:</p>
<p><a href="http://blogs.clearscreen.com/nandy/admin/$SLBeta2WS3.jpg"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="226" alt="SLBeta2WS" src="http://www.fernandocortes.net/image.axd?picture=WindowsLiveWriter/SilverlightBeta2Crossdomain_12FF3/SLBeta2WS.jpg" width="644" border="0" /></a> </p>
<p>El formato del fichero <strong>ClientAccessPolicy.xml</strong> que teníamos hasta ahora con el que conseguíamos que funcionase era:</p><pre class="code"><span style="COLOR: blue">&lt;?</span><span style="COLOR: #a31515">xml </span><span style="COLOR: red">version</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">1.0</span>" <span style="COLOR: red">encoding</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">utf-8</span>"<span style="COLOR: blue">?&gt;
&lt;</span><span style="COLOR: #a31515">access-policy</span><span style="COLOR: blue">&gt;
  &lt;</span><span style="COLOR: #a31515">cross-domain-access</span><span style="COLOR: blue">&gt;
    &lt;</span><span style="COLOR: #a31515">policy</span><span style="COLOR: blue">&gt;
      &lt;</span><span style="COLOR: #a31515">allow-from</span><span style="COLOR: blue">&gt;
        &lt;</span><span style="COLOR: #a31515">domain </span><span style="COLOR: red">uri</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">*</span>"<span style="COLOR: blue">/&gt;
      &lt;/</span><span style="COLOR: #a31515">allow-from</span><span style="COLOR: blue">&gt;
      &lt;</span><span style="COLOR: #a31515">grant-to</span><span style="COLOR: blue">&gt;
        &lt;</span><span style="COLOR: #a31515">resource </span><span style="COLOR: red">path</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">/</span>" <span style="COLOR: red">include-subpaths</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">true</span>"<span style="COLOR: blue">/&gt;
      &lt;/</span><span style="COLOR: #a31515">grant-to</span><span style="COLOR: blue">&gt;
    &lt;/</span><span style="COLOR: #a31515">policy</span><span style="COLOR: blue">&gt;
  &lt;/</span><span style="COLOR: #a31515">cross-domain-access</span><span style="COLOR: blue">&gt;
&lt;/</span><span style="COLOR: #a31515">access-policy</span><span style="COLOR: blue">&gt;</span></pre><a href="http://11011.net/software/vspaste"></a>
<p>Pero para esta versión necesitamos realizar un sutil cambio en el fichero:</p><pre class="code"><span style="COLOR: blue">&lt;?</span><span style="COLOR: #a31515">xml </span><span style="COLOR: red">version</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">1.0</span>" <span style="COLOR: red">encoding</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">utf-8</span>"<span style="COLOR: blue">?&gt;
&lt;</span><span style="COLOR: #a31515">access-policy</span><span style="COLOR: blue">&gt;
  &lt;</span><span style="COLOR: #a31515">cross-domain-access</span><span style="COLOR: blue">&gt;
    &lt;</span><span style="COLOR: #a31515">policy</span><span style="COLOR: blue">&gt;
      &lt;</span><span style="COLOR: #a31515">allow-from </span><strong><span style="COLOR: red">http-request-headers</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">*</span>"</strong><span style="COLOR: blue">&gt;
        &lt;</span><span style="COLOR: #a31515">domain </span><span style="COLOR: red">uri</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">*</span>"<span style="COLOR: blue">/&gt;
      &lt;/</span><span style="COLOR: #a31515">allow-from</span><span style="COLOR: blue">&gt;
      &lt;</span><span style="COLOR: #a31515">grant-to</span><span style="COLOR: blue">&gt;
        &lt;</span><span style="COLOR: #a31515">resource </span><span style="COLOR: red">path</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">/</span>" <span style="COLOR: red">include-subpaths</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">true</span>"<span style="COLOR: blue">/&gt;
      &lt;/</span><span style="COLOR: #a31515">grant-to</span><span style="COLOR: blue">&gt;
    &lt;/</span><span style="COLOR: #a31515">policy</span><span style="COLOR: blue">&gt;
  &lt;/</span><span style="COLOR: #a31515">cross-domain-access</span><span style="COLOR: blue">&gt;
&lt;/</span><span style="COLOR: #a31515">access-policy</span><span style="COLOR: blue">&gt;</span></pre><a href="http://11011.net/software/vspaste"></a>
<p>Ahora si que funciona nuestro Silverlight.</p><img src ="http://blogs.clearscreen.com/nandy/aggbug/12018.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Internet Explorer cannot display the webpage</title><link>http://blogs.clearscreen.com/nandy/archive/2008/06/16/12017.aspx</link><pubDate>Mon, 16 Jun 2008 06:16:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2008/06/16/12017.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/12017.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2008/06/16/12017.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/12017.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/12017.aspx</trackback:ping><description>&lt;p&gt;Vamos por partes. Máquina con Windows Vista y Microsoft Visual Studio 2008 recién instalado. Creamos un nuevo sitio web y cuando queremos depurar, nos encontramos con esto:&lt;/p&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="323" alt="NoEncuentralocalhost" src="http://www.fernandocortes.net/image.axd?picture=WindowsLiveWriter/InternetExplorercannotdisplaythewebpage_102AC/NoEncuentralocalhost_1.jpg" width="644" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;¿Qué será?....El problema esta en el puñetero IPv6, y ¿Cómo deshabilitar esto?&lt;/p&gt;
&lt;p&gt;Abrimos Regedit.exe y en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters añadimos un DWORD de nombre &lt;strong&gt;DisabledComponents&lt;/strong&gt; y asignamos el valor decimal 255.&lt;/p&gt;
&lt;p&gt;Después de reiniciar he conseguido que funcione, a pesar de que aunque el ASP.NET Development Server levanta un puerto, en el IE 7 intenta acceder a otro!!&lt;/p&gt;
&lt;p&gt;Otro día busco porqué!&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/12017.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Vamos por partes. Máquina con Windows Vista y Microsoft Visual Studio 2008 recién instalado. Creamos un nuevo sitio web y cuando queremos depurar, nos encontramos con esto:</p>
<p><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="323" alt="NoEncuentralocalhost" src="http://www.fernandocortes.net/image.axd?picture=WindowsLiveWriter/InternetExplorercannotdisplaythewebpage_102AC/NoEncuentralocalhost_1.jpg" width="644" border="0" /></p>
<p>¿Qué será?....El problema esta en el puñetero IPv6, y ¿Cómo deshabilitar esto?</p>
<p>Abrimos Regedit.exe y en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters añadimos un DWORD de nombre <strong>DisabledComponents</strong> y asignamos el valor decimal 255.</p>
<p>Después de reiniciar he conseguido que funcione, a pesar de que aunque el ASP.NET Development Server levanta un puerto, en el IE 7 intenta acceder a otro!!</p>
<p>Otro día busco porqué!</p><img src ="http://blogs.clearscreen.com/nandy/aggbug/12017.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Compartir cookies de autenticación entre aplicaciones asp.net 1.1 y asp.net 2.0</title><link>http://blogs.clearscreen.com/nandy/archive/2006/12/04/4822.aspx</link><pubDate>Mon, 04 Dec 2006 12:26:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2006/12/04/4822.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/4822.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2006/12/04/4822.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/4822.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/4822.aspx</trackback:ping><description>&lt;p&gt;Despues de un viernes de sorporte al límite, conseguí encontrar el problema a una incidencia que me plantearon. El problema estaba al compartir cookies de autenticación entre dos aplicaciones asp.net, una escrita con .net 1.1 y la otra con .net 2.0. Buceando por la red encontré varios artículos que comentaban soluciones y la que más me ayudo fué sin duda la de ScottGu donde explica como compartir cookies entre aplicaciones compiladas con distintas versiones de framework. &lt;a href="http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx"&gt;Link al Artículo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La solución que se plantea en dicho artículo y que me funcionó es la de fijar, en el web.config de cada aplicación o en el machine.config de cada framework, los atributos &lt;em&gt;validationkey&lt;/em&gt; y &lt;em&gt;descryptionkey &lt;/em&gt;del tag &lt;em&gt;&lt;machinekey /&gt;. &lt;/em&gt;Además, como bien apunta Scott en su artículo, en la aplicación 2.0 debemos añadir además el atributo &lt;em&gt;decyption&lt;/em&gt; con el valor 3DES, que es el que está marcado por defecto en .net 1.1 y que no permite modificarlo.&lt;/p&gt;
&lt;p&gt;Por tanto, con esta serie de cambios podremos compartir cookies de autenticación entre aplicaciones sin necesidad de pedir al usuario que vuelva a autenticarse cuando pase de una aplicación a otra.&lt;/p&gt;
&lt;p&gt;&lt;machinekey validationkey="CB495ABD71FFF18DC6959A1BFD6BDFDF2F17A94E12711DDDC0CB48D4BA66CF6CA04801D7E2EEE5824EABE01CF62549321A182A52FE029A33290AFB4B52A1B343" decryptionkey="81AC1452399D560E6FF5F7BDB0401052F5A4A9BF002156AA" validation="SHA1" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;machinekey validation="SHA1" validationkey="B78B59196AC23B35CE996FD16DEA1795B73F52BB53562BE60DAC334F2D87FB44695975D6B8B5A792156C3A1FF8F760B67E688DBB170E21FE5772A25040E474D5" decryptionkey="DCD11498D796401AE961B7F10C64EE71DB4547E04D76DB9F" /&gt;&lt;/p&gt;
&lt;p&gt;Existe una herramienta online que genera este código para la versión 1.1 y que nos facilita bastante el trabajo: &lt;a href="http://www.aspnetresources.com/tools/keycreator.aspx"&gt;http://www.aspnetresources.com/tools/keycreator.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saludos&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/4822.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Despues de un viernes de sorporte al límite, conseguí encontrar el problema a una incidencia que me plantearon. El problema estaba al compartir cookies de autenticación entre dos aplicaciones asp.net, una escrita con .net 1.1 y la otra con .net 2.0. Buceando por la red encontré varios artículos que comentaban soluciones y la que más me ayudo fué sin duda la de ScottGu donde explica como compartir cookies entre aplicaciones compiladas con distintas versiones de framework. <a href="http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx">Link al Artículo</a>.</p>
<p>La solución que se plantea en dicho artículo y que me funcionó es la de fijar, en el web.config de cada aplicación o en el machine.config de cada framework, los atributos <em>validationkey</em> y <em>descryptionkey </em>del tag <em><machinekey />. </em>Además, como bien apunta Scott en su artículo, en la aplicación 2.0 debemos añadir además el atributo <em>decyption</em> con el valor 3DES, que es el que está marcado por defecto en .net 1.1 y que no permite modificarlo.</p>
<p>Por tanto, con esta serie de cambios podremos compartir cookies de autenticación entre aplicaciones sin necesidad de pedir al usuario que vuelva a autenticarse cuando pase de una aplicación a otra.</p>
<p><machinekey validationkey="CB495ABD71FFF18DC6959A1BFD6BDFDF2F17A94E12711DDDC0CB48D4BA66CF6CA04801D7E2EEE5824EABE01CF62549321A182A52FE029A33290AFB4B52A1B343" decryptionkey="81AC1452399D560E6FF5F7BDB0401052F5A4A9BF002156AA" validation="SHA1" /></p>
<p><machinekey validation="SHA1" validationkey="B78B59196AC23B35CE996FD16DEA1795B73F52BB53562BE60DAC334F2D87FB44695975D6B8B5A792156C3A1FF8F760B67E688DBB170E21FE5772A25040E474D5" decryptionkey="DCD11498D796401AE961B7F10C64EE71DB4547E04D76DB9F" /></p>
<p>Existe una herramienta online que genera este código para la versión 1.1 y que nos facilita bastante el trabajo: <a href="http://www.aspnetresources.com/tools/keycreator.aspx">http://www.aspnetresources.com/tools/keycreator.aspx</a></p>
<p>Saludos</p><img src ="http://blogs.clearscreen.com/nandy/aggbug/4822.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Visual Studio 2005 WebTest And AJAX</title><link>http://blogs.clearscreen.com/nandy/archive/2006/11/24/4579.aspx</link><pubDate>Fri, 24 Nov 2006 13:43:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2006/11/24/4579.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/4579.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2006/11/24/4579.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/4579.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/4579.aspx</trackback:ping><description>&lt;p&gt;Exiten alguno "problemillas" encuanto a la grabación de escenarios web que contienen funcionalidad de tipo Ajax. Es tan simple el fallo como que no detecta muchas de las peticiones HTTP que realiza la funcionalidad Ajax a probar.&lt;/p&gt; &lt;p&gt;Por suerte, disponemos de una herramienta que ya existía antes del lanzamiento de Visual Studio 2005, llamada &lt;a href="http://www.fiddlertool.com/" target="_blank"&gt;Fiddler HTTP debugger&lt;/a&gt; que nos permitirá capturar absolutamente todas las peticiones HTTP que nuestro navegador realice. Y como colofón final, nos permite exportar las peticiones en un fichero de tipo .WebTest con que le podremos "trastear" y modificar ya con Visual Studio 2005.&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/4579.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Exiten alguno "problemillas" encuanto a la grabación de escenarios web que contienen funcionalidad de tipo Ajax. Es tan simple el fallo como que no detecta muchas de las peticiones HTTP que realiza la funcionalidad Ajax a probar.</p> <p>Por suerte, disponemos de una herramienta que ya existía antes del lanzamiento de Visual Studio 2005, llamada <a href="http://www.fiddlertool.com/" target="_blank">Fiddler HTTP debugger</a> que nos permitirá capturar absolutamente todas las peticiones HTTP que nuestro navegador realice. Y como colofón final, nos permite exportar las peticiones en un fichero de tipo .WebTest con que le podremos "trastear" y modificar ya con Visual Studio 2005.</p><img src ="http://blogs.clearscreen.com/nandy/aggbug/4579.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>Video - Developing ASP.NET 2.0 Applications using "Atlas"</title><link>http://blogs.clearscreen.com/nandy/archive/2006/04/20/2991.aspx</link><pubDate>Thu, 20 Apr 2006 15:34:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2006/04/20/2991.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/2991.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2006/04/20/2991.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/2991.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/2991.aspx</trackback:ping><description>&lt;p&gt;¡Otra cosa en relación al último post! Podemos descargarnos varios videos entre los que se encuentra uno con el mismo título que este post en &lt;a href="http://atlas.asp.net/Default.aspx?tabid=47"&gt;ATLAS ASP.NET Web: The Official Microsoft "ATLAS" Site : Atlas&lt;/a&gt; donde se explica muy bien "en inglés" mediante un sencillísimo ejemplo como implementar una aplicación ajax.&lt;/p&gt;
&lt;p&gt;Observar como a evolucionado la framework de "Atlas" desde la charla de Miguel. :-D&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a href="http://www.madriddotnet.com"&gt;MAD.NUG - Madrid .NET User Group&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/2991.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>¡Otra cosa en relación al último post! Podemos descargarnos varios videos entre los que se encuentra uno con el mismo título que este post en <a href="http://atlas.asp.net/Default.aspx?tabid=47">ATLAS ASP.NET Web: The Official Microsoft "ATLAS" Site : Atlas</a> donde se explica muy bien "en inglés" mediante un sencillísimo ejemplo como implementar una aplicación ajax.</p>
<p>Observar como a evolucionado la framework de "Atlas" desde la charla de Miguel. :-D</p>
<br />
<p><a href="http://www.madriddotnet.com">MAD.NUG - Madrid .NET User Group</a></p><img src ="http://blogs.clearscreen.com/nandy/aggbug/2991.aspx" width = "1" height = "1" /></body></item><item><dc:creator>Fernando Cortés Hierro</dc:creator><title>ASP.NET “Atlas” April Community Technology Preview (CTP)</title><link>http://blogs.clearscreen.com/nandy/archive/2006/04/20/2990.aspx</link><pubDate>Thu, 20 Apr 2006 15:27:00 GMT</pubDate><guid>http://blogs.clearscreen.com/nandy/archive/2006/04/20/2990.aspx</guid><wfw:comment>http://blogs.clearscreen.com/nandy/comments/2990.aspx</wfw:comment><comments>http://blogs.clearscreen.com/nandy/archive/2006/04/20/2990.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.clearscreen.com/nandy/comments/commentRss/2990.aspx</wfw:commentRss><trackback:ping>http://blogs.clearscreen.com/nandy/services/trackbacks/2990.aspx</trackback:ping><description>&lt;p&gt;Si recordais quienes estuvisteis en la charla que dio &lt;a href="http://blogs.clearscreen.com/mig"&gt;Miguel Jimenez&lt;/a&gt; sobre Atlas en una de las reuniones del grupo de usuarios de &lt;a href="http://www.madriddotnet.com"&gt;MAD.NUG&lt;/a&gt;, este post viene a informar que finalmente se liberado la CTP de Atlas que se puede descargar de &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B01DC501-B3C1-4EC0-93F0-7DAC68D2F787&amp;amp;displaylang=en"&gt;ASP.NET “Atlas” April Community Technology Preview (CTP)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recordad que ASP.NET "Atlas" necesita de la Microsoft .NET Framework Version 2.0.&lt;/p&gt;&lt;img src ="http://blogs.clearscreen.com/nandy/aggbug/2990.aspx" width = "1" height = "1" /&gt;</description><body xmlns="http://www.w3.org/1999/xhtml"><p>Si recordais quienes estuvisteis en la charla que dio <a href="http://blogs.clearscreen.com/mig">Miguel Jimenez</a> sobre Atlas en una de las reuniones del grupo de usuarios de <a href="http://www.madriddotnet.com">MAD.NUG</a>, este post viene a informar que finalmente se liberado la CTP de Atlas que se puede descargar de <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B01DC501-B3C1-4EC0-93F0-7DAC68D2F787&amp;displaylang=en">ASP.NET “Atlas” April Community Technology Preview (CTP)</a></p>
<p>Recordad que ASP.NET "Atlas" necesita de la Microsoft .NET Framework Version 2.0.</p><img src ="http://blogs.clearscreen.com/nandy/aggbug/2990.aspx" width = "1" height = "1" /></body></item></channel></rss>