<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aspnetcoremaster.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aspnetcoremaster.com/" rel="alternate" type="text/html" hreflang="es" /><updated>2025-08-06T14:17:12+00:00</updated><id>https://aspnetcoremaster.com/feed.xml</id><title type="html">ASP.NET Core Master</title><subtitle>Sitio dedicado a temas de programación usando C# ,ASP.NET Core, Entity Framework Core y Sql Server.</subtitle><author><name>Benjamin Camacho</name></author><entry xml:lang="es"><title type="html">Como deserializar JSON con C#</title><link href="https://aspnetcoremaster.com/csharp/2023/03/19/deserializar-json-con-csharp.md.html" rel="alternate" type="text/html" title="Como deserializar JSON con C#" /><published>2023-03-19T00:00:00+00:00</published><updated>2023-03-19T00:00:00+00:00</updated><id>https://aspnetcoremaster.com/csharp/2023/03/19/deserializar-json-con-csharp.md</id><content type="html" xml:base="https://aspnetcoremaster.com/csharp/2023/03/19/deserializar-json-con-csharp.md.html"><![CDATA[<p>En la actualidad, las aplicaciones web y móviles están diseñadas para ser altamente interactivas y responsivas. Una de las formas más comunes de transferir datos en estas aplicaciones es mediante el formato JSON (JavaScript Object Notation). JSON es un formato de intercambio de datos ligero y fácil de leer, que ha ganado popularidad en los últimos años.</p>

<p>En las aplicaciones creadas con C#, podemos utilizar el espacio de nombres <code class="language-plaintext highlighter-rouge">System.Text.Json</code> del .NET Core para serializar y deserializar objetos JSON. En este artículo, exploraremos cómo deserializar JSON con C# usando el espacio de nombres <code class="language-plaintext highlighter-rouge">System.Text.Json</code>.</p>

<p>¿Qué es <code class="language-plaintext highlighter-rouge">System.Text.Json</code>?</p>

<p><code class="language-plaintext highlighter-rouge">System.Text.Json</code> es un espacio de nombres que se introdujo en .NET Core 3.0 y se utiliza para serializar y deserializar objetos JSON. Es una alternativa ligera y de alto rendimiento a la biblioteca <code class="language-plaintext highlighter-rouge">Newtonsoft.Json</code> que se ha utilizado durante mucho tiempo para el mismo propósito.</p>

<p><code class="language-plaintext highlighter-rouge">System.Text.Json</code> está integrado en el .NET Core y se puede utilizar sin tener que agregar ninguna biblioteca o paquete adicional. Esto significa que las aplicaciones creadas con .NET Core pueden ser más ligeras y tener un mejor rendimie</p>

<h2 id="cómo-deserializar-json-con-systemtextjson">Cómo deserializar JSON con <code class="language-plaintext highlighter-rouge">System.Text.Json</code></h2>

<p>Para deserializar un objeto JSON con System.Text.Json, debemos seguir los siguientes pasos:</p>

<ol>
  <li>Definir una clase C# que tenga las mismas propiedades que el JSON. Por ejemplo, si tenemos el siguiente JSON:</li>
</ol>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"John"</span><span class="p">,</span><span class="w"> </span><span class="nl">"age"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="nl">"city"</span><span class="p">:</span><span class="w"> </span><span class="s2">"New York"</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Podemos definir una clase C# como la siguiente:</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Person</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Age</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">City</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<ol>
  <li>Usar el método <code class="language-plaintext highlighter-rouge">Deserialize&lt;T&gt;</code> de la clase <code class="language-plaintext highlighter-rouge">JsonSerializer</code> de <code class="language-plaintext highlighter-rouge">System.Text.Json</code> para deserializar el JSON en un objeto C#. Por ejemplo:</li>
</ol>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">string</span> <span class="n">jsonString</span> <span class="p">=</span> <span class="s">"{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}"</span><span class="p">;</span>
<span class="n">Person</span> <span class="n">person</span> <span class="p">=</span> <span class="n">JsonSerializer</span><span class="p">.</span><span class="n">Deserialize</span><span class="p">&lt;</span><span class="n">Person</span><span class="p">&gt;(</span><span class="n">jsonString</span><span class="p">);</span>
</code></pre></div></div>

<p>En este ejemplo, hemos utilizado el método <code class="language-plaintext highlighter-rouge">Deserialize&lt;T&gt;</code> de la clase JsonSerializer para deserializar el JSON en un objeto de tipo <code class="language-plaintext highlighter-rouge">Person</code>.</p>

<ol>
  <li>Utilizar el objeto deserializado según sea necesario. Por ejemplo, podemos imprimir las propiedades del objeto de la siguiente manera:</li>
</ol>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Name: {0}"</span><span class="p">,</span> <span class="n">person</span><span class="p">.</span><span class="n">Name</span><span class="p">);</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Age: {0}"</span><span class="p">,</span> <span class="n">person</span><span class="p">.</span><span class="n">Age</span><span class="p">);</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"City: {0}"</span><span class="p">,</span> <span class="n">person</span><span class="p">.</span><span class="n">City</span><span class="p">);</span>
</code></pre></div></div>

<p>En resumen, deserializar JSON con C# usando el espacio de nombres System.Text.Json es muy fácil y sencillo. Solo necesitamos definir una clase C# que tenga las mismas propiedades que el JSON, luego utilizar el método <code class="language-plaintext highlighter-rouge">Deserialize&lt;T&gt;</code> de la clase <code class="language-plaintext highlighter-rouge">JsonSerializer</code> para deserializar el JSON. Una vez que se ha deserializado el JSON, podemos usar el objeto resultante según sea necesario para realizar las operaciones necesarias.</p>]]></content><author><name>benjamin</name></author><category term="csharp" /><summary type="html"><![CDATA[En la actualidad, las aplicaciones web y móviles están diseñadas para ser altamente interactivas y responsivas. Una de las formas más comunes de transferir datos en estas aplicaciones es mediante el formato JSON (JavaScript Object Notation). JSON es un formato de intercambio de datos ligero y fácil de leer, que ha ganado popularidad en los últimos años.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-image.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-image.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Delegados en C#</title><link href="https://aspnetcoremaster.com/csharp/2023/03/09/delegados.html" rel="alternate" type="text/html" title="Delegados en C#" /><published>2023-03-09T12:00:01+00:00</published><updated>2022-09-06T08:50:25+00:00</updated><id>https://aspnetcoremaster.com/csharp/2023/03/09/delegados</id><content type="html" xml:base="https://aspnetcoremaster.com/csharp/2023/03/09/delegados.html"><![CDATA[<h2 id="introducción">Introducción</h2>

<p>En C#, los delegados son un tipo de datos especiales que permiten la creación de funciones que pueden ser tratadas como variables. Se utilizan para permitir que un método pueda ser pasado como parámetro a otro método. Los delegados son una característica importante de la programación orientada a objetos (POO) y son esenciales para el desarrollo de aplicaciones robustas y flexibles.</p>

<p>En este artículo, explicaremos qué son los delegados y cómo pueden ser utilizados en C#. También discutiremos algunos tipos de delegados y proporcionaremos ejemplos de cómo se pueden utilizar en diferentes situaciones.</p>

<h2 id="qué-son-los-delegados">Qué son los delegados</h2>

<p>Un delegado es un tipo de datos que hace referencia a un método en particular. En otras palabras, un delegado es una variable que almacena un método en lugar de un valor. Los delegados se utilizan para pasar métodos como parámetros a otros métodos, lo que permite una mayor flexibilidad y modularidad en el código.</p>

<p>Un delegado se puede pensar como un puntero a una función en otros lenguajes de programación. Los delegados tienen un tipo de datos específico y pueden ser declarados y utilizados como cualquier otra variable. Pueden ser asignados a cualquier método que cumpla con su firma, que es el tipo de parámetro y el tipo de valor devuelto del método.</p>

<p>Los delegados pueden ser utilizados para crear eventos, que son notificaciones que se envían cuando una acción ocurre. Los eventos son una forma de comunicación entre dos objetos, lo que permite la ejecución de un método en un objeto cuando se produce un cambio en otro objeto.</p>

<p>Cómo se utilizan los delegados en C#</p>

<p>Para utilizar un delegado en C#, es necesario declararlo y asignarle un método que coincida con su firma. El siguiente código muestra cómo se declara un delegado y se le asigna un método:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Declarar el delegado</span>
<span class="k">delegate</span> <span class="kt">int</span> <span class="nf">delegadoEjemplo</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">);</span>

<span class="c1">// Asignarle un método</span>
<span class="n">delegadoEjemplo</span> <span class="n">m</span><span class="err">é</span><span class="n">todoDelegado</span> <span class="p">=</span> <span class="n">Suma</span><span class="p">;</span>
</code></pre></div></div>

<p>El método <code class="language-plaintext highlighter-rouge">Suma</code> es un método que toma dos argumentos enteros y devuelve la suma de ambos. El delegado <code class="language-plaintext highlighter-rouge">delegadoEjemplo</code> toma dos argumentos enteros y devuelve un valor entero, lo que lo hace compatible con el método <code class="language-plaintext highlighter-rouge">Suma</code>.</p>

<p>Una vez que se asigna un método a un delegado, se puede llamar al método utilizando el delegado, como se muestra en el siguiente código:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Llamar al método a través del delegado</span>
<span class="kt">int</span> <span class="n">resultado</span> <span class="p">=</span> <span class="n">m</span><span class="err">é</span><span class="nf">todoDelegado</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
</code></pre></div></div>

<p>El resultado de la suma de 2 y 3 se almacena en la variable <code class="language-plaintext highlighter-rouge">resultado</code>. Este ejemplo muestra cómo se puede utilizar un delegado para pasar un método como parámetro a otro método.</p>

<p>Tipos de delegados en C#</p>

<p>Existen varios tipos de delegados en C#, algunos de los cuales se discuten a continuación:</p>

<ol>
  <li>Delegados con devolución de llamada: Estos delegados se utilizan para crear un mecanismo de devolución de llamada, donde un método se llama después de que se ha completado otro método. Este tipo de delegado se utiliza para implementar métodos asincrónicos en C#. Un ejemplo de delegado con devolución de llamada es el delegado <code class="language-plaintext highlighter-rouge">AsyncCallback</code>.</li>
</ol>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Delegado AsyncCallback</span>
<span class="k">public</span> <span class="k">delegate</span> <span class="k">void</span> <span class="nf">AsyncCallback</span><span class="p">(</span><span class="n">IAsyncResult</span> <span class="n">ar</span><span class="p">);</span>
</code></pre></div></div>

<ol>
  <li>Delegados genéricos: Estos delegados se utilizan para crear métodos genéricos que pueden funcionar con diferentes tipos de datos. Por ejemplo, el delegado <code class="language-plaintext highlighter-rouge">Func&lt;T, TResult&gt;</code> toma un argumento de cualquier tipo <code class="language-plaintext highlighter-rouge">T</code> y devuelve un valor del tipo <code class="language-plaintext highlighter-rouge">TResult</code>.</li>
</ol>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Delegado genérico Func</span>
<span class="k">public</span> <span class="k">delegate</span> <span class="n">TResult</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">TResult</span><span class="p">&gt;(</span><span class="n">T</span> <span class="n">arg</span><span class="p">);</span>
</code></pre></div></div>

<ol>
  <li>Delegados multicast: Estos delegados pueden invocar múltiples métodos encadenados juntos. Se utilizan para crear eventos en C#. Los delegados multicast se crean utilizando el operador <code class="language-plaintext highlighter-rouge">+=</code>.</li>
</ol>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Delegado multicast</span>
<span class="k">public</span> <span class="k">delegate</span> <span class="k">void</span> <span class="nf">DelegadoMulticast</span><span class="p">();</span>

<span class="n">DelegadoMulticast</span> <span class="n">miDelegado</span> <span class="p">=</span> <span class="n">metodo1</span><span class="p">;</span>
<span class="n">miDelegado</span> <span class="p">+=</span> <span class="n">metodo2</span><span class="p">;</span>
</code></pre></div></div>

<p>En este ejemplo, se asignan dos métodos <code class="language-plaintext highlighter-rouge">metodo1</code> y <code class="language-plaintext highlighter-rouge">metodo2</code> al delegado <code class="language-plaintext highlighter-rouge">miDelegado</code>. Cuando se llama al delegado, se llamarán ambos métodos.</p>

<h2 id="ejemplos-de-uso-de-delegados-en-c">Ejemplos de uso de delegados en C#</h2>

<p>A continuación se presentan algunos ejemplos de cómo se pueden utilizar los delegados en C#.</p>

<ol>
  <li>Delegado para ordenar una lista</li>
</ol>

<p>Suponga que tiene una lista de números y desea ordenarlos en orden ascendente. En lugar de escribir su propio código de clasificación, puede utilizar el método <code class="language-plaintext highlighter-rouge">Sort()</code> de la lista y pasar un delegado que especifique cómo se deben ordenar los elementos.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">numeros</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;()</span> <span class="p">{</span> <span class="m">5</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">8</span><span class="p">,</span> <span class="m">4</span> <span class="p">};</span>

<span class="c1">// Delegado para ordenar la lista</span>
<span class="n">numeros</span><span class="p">.</span><span class="nf">Sort</span><span class="p">(</span><span class="k">delegate</span> <span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="p">.</span><span class="nf">CompareTo</span><span class="p">(</span><span class="n">y</span><span class="p">);</span> <span class="p">});</span>
</code></pre></div></div>

<p>El delegado utilizado aquí toma dos argumentos <code class="language-plaintext highlighter-rouge">x</code> e <code class="language-plaintext highlighter-rouge">y</code> y devuelve el resultado de la comparación. En este caso, se utiliza el método <code class="language-plaintext highlighter-rouge">CompareTo()</code> de la clase <code class="language-plaintext highlighter-rouge">int</code> para comparar los dos valores y devolver su diferencia.</p>

<ol>
  <li>Delegado para filtrar elementos en una lista</li>
</ol>

<p>Suponga que tiene una lista de personas y desea filtrar aquellos que tienen más de 30 años. Puede utilizar un delegado con el método <code class="language-plaintext highlighter-rouge">FindAll()</code> de la lista para filtrar los elementos y devolver solo aquellos que cumplen con un criterio específico.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Persona</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">Persona</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Nombre</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Edad</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>

<span class="n">List</span><span class="p">&lt;</span><span class="n">Persona</span><span class="p">&gt;</span> <span class="n">personas</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Persona</span><span class="p">&gt;()</span> <span class="p">{</span>
  <span class="k">new</span> <span class="nf">Persona</span><span class="p">()</span> <span class="p">{</span> <span class="n">Nombre</span> <span class="p">=</span> <span class="s">"Pedro"</span><span class="p">,</span> <span class="n">Edad</span> <span class="p">=</span> <span class="m">25</span><span class="p">},</span>
  <span class="k">new</span> <span class="nf">Persona</span><span class="p">()</span> <span class="p">{</span> <span class="n">Nombre</span> <span class="p">=</span> <span class="s">"Ana"</span><span class="p">,</span> <span class="n">Edad</span> <span class="p">=</span> <span class="m">35</span><span class="p">},</span>
  <span class="k">new</span> <span class="nf">Persona</span><span class="p">()</span> <span class="p">{</span> <span class="n">Nombre</span> <span class="p">=</span> <span class="s">"Juan"</span><span class="p">,</span> <span class="n">Edad</span> <span class="p">=</span> <span class="m">40</span><span class="p">},</span>
<span class="p">};</span>

<span class="c1">// Delegado para filtrar personas mayores de 30 años</span>
<span class="n">List</span><span class="p">&lt;</span><span class="n">Persona</span><span class="p">&gt;</span> <span class="n">personasMayores</span> <span class="p">=</span> <span class="n">personas</span><span class="p">.</span><span class="nf">FindAll</span><span class="p">(</span><span class="k">delegate</span> <span class="p">(</span><span class="n">Persona</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">p</span><span class="p">.</span><span class="n">Edad</span> <span class="p">&gt;</span> <span class="m">30</span><span class="p">;</span> <span class="p">});</span>
</code></pre></div></div>

<p>En este ejemplo, se utiliza el método <code class="language-plaintext highlighter-rouge">FindAll()</code> de la lista de personas y se pasa un delegado que especifica el criterio de filtrado. El delegado toma un objeto <code class="language-plaintext highlighter-rouge">Persona</code> y devuelve <code class="language-plaintext highlighter-rouge">true</code> si la edad es mayor de 30.</p>

<ol>
  <li>Delegado para crear un método asincrónico</li>
</ol>

<p>Suponga que desea crear un método en su aplicación que realice una operación en segundo plano y llame a un método cuando se haya completado. Puede utilizar un delegado con el método <code class="language-plaintext highlighter-rouge">BeginInvoke()</code> para crear un método asincrónico que llame a un método cuando se haya completado.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">delegate</span> <span class="k">void</span> <span class="nf">FinalizacionDelegado</span><span class="p">(</span><span class="kt">string</span> <span class="n">resultado</span><span class="p">);</span>

<span class="k">public</span> <span class="k">void</span> <span class="nf">OperacionAsincronica</span><span class="p">(</span><span class="kt">int</span> <span class="n">valor</span><span class="p">,</span> <span class="n">FinalizacionDelegado</span> <span class="n">finalizacion</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Operación en segundo plano</span>
    <span class="n">Thread</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="m">2000</span><span class="p">);</span>

    <span class="kt">string</span> <span class="n">resultado</span> <span class="p">=</span> <span class="s">$"El valor es </span><span class="p">{</span><span class="n">valor</span><span class="p">}</span><span class="s">"</span><span class="p">;</span>

    <span class="c1">// Llamada al delegado cuando se completa la operación</span>
    <span class="nf">finalizacion</span><span class="p">(</span><span class="n">resultado</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// Llamada al método asincrónico</span>
<span class="nf">OperacionAsincronica</span><span class="p">(</span> <span class="m">5</span><span class="p">,</span> <span class="k">delegate</span> <span class="p">(</span><span class="kt">string</span> <span class="n">resultado</span><span class="p">)</span> <span class="p">{</span> <span class="n">MessageBox</span><span class="p">.</span><span class="nf">Show</span><span class="p">(</span><span class="n">resultado</span><span class="p">);</span> <span class="p">});</span>
</code></pre></div></div>

<p>En este ejemplo, se crea un método <code class="language-plaintext highlighter-rouge">OperacionAsincronica()</code> que toma un valor y un delegado como parámetros. El método realiza una operación en segundo plano, espera dos segundos y luego llama al delegado con el resultado de la operación.</p>

<p>Conclusiones</p>

<p>Los delegados son una característica importante de C# que permiten la creación de métodos modularizados y flexibles. Pueden ser utilizados para crear métodos asincrónicos, eventos, filtros y más. Los delegados se asignan a métodos y se manejan como variables, lo que permite una mayor flexibilidad en el código. Con estos ejemplos, esperamos haberle proporcionado una buena comprensión de cómo se pueden utilizar los delegados en su código C#.</p>]]></content><author><name>benjamin</name></author><category term="csharp" /><summary type="html"><![CDATA[En C#, los delegados son un tipo de datos especiales que permiten la creación de funciones que pueden ser tratadas como variables.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-image.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-image.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Ejemplos de cadenas de conexión de algunos servicios de Azure</title><link href="https://aspnetcoremaster.com/azure/ejemplos-de-cadenas-de-conexion-para-los-servicios-de-azure.html" rel="alternate" type="text/html" title="Ejemplos de cadenas de conexión de algunos servicios de Azure" /><published>2022-12-21T10:10:55+00:00</published><updated>2022-12-21T10:10:55+00:00</updated><id>https://aspnetcoremaster.com/azure/ejemplos-de-cadenas-de-conexion-para-los-servicios-de-azure</id><content type="html" xml:base="https://aspnetcoremaster.com/azure/ejemplos-de-cadenas-de-conexion-para-los-servicios-de-azure.html"><![CDATA[<p>Como estoy estudiando para presentar el examen AZ-204 y en los cuestionarios de entrenamiento encontre preguntas donde te mostraban un fragmento de codigo que usa una cadena de conexión para algun servicio de Azure.</p>

<table>
  <thead>
    <tr>
      <th>Servicio de Azure</th>
      <th>Ejemplo de cadena de conexión</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Azure SQL Database</td>
      <td>Server=tcp:{server-name}.database.windows.net,1433;Initial Catalog={database-name};Persist Security Info=False;User ID={username};Password={password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;</td>
    </tr>
    <tr>
      <td>Azure Storage</td>
      <td>DefaultEndpointsProtocol=https;AccountName={storage-account-name};AccountKey={storage-account-key}</td>
    </tr>
    <tr>
      <td>Azure Service Bus</td>
      <td>Endpoint=sb://{service-bus-namespace-name}.servicebus.windows.net/;SharedAccessKeyName={shared-access-key-name};SharedAccessKey={shared-access-key}</td>
    </tr>
    <tr>
      <td>Azure Event Hubs</td>
      <td>Endpoint=sb://{event-hub-namespace-name}.servicebus.windows.net/;EntityPath={event-hub-name};SharedAccessKeyName={shared-access-key-name};SharedAccessKey={shared-access-key}</td>
    </tr>
    <tr>
      <td>Azure Cosmos DB</td>
      <td>AccountEndpoint={cosmos-db-account-endpoint};AccountKey={cosmos-db-account-key}</td>
    </tr>
    <tr>
      <td>Azure Redis Cache</td>
      <td>{redis-cache-name}.redis.cache.windows.net,abortConnect=false,ssl=true,password={redis-cache-primary-key}</td>
    </tr>
    <tr>
      <td>Azure Search</td>
      <td>https://{search-service-name}.search.windows.net/;ApiKey={search-service-admin-key}</td>
    </tr>
    <tr>
      <td>Azure Function App</td>
      <td>https://{function-app-name}.azurewebsites.net/</td>
    </tr>
    <tr>
      <td>Azure Data Lake Storage Gen2</td>
      <td>https://{data-lake-store-name}.dfs.core.windows.net/</td>
    </tr>
    <tr>
      <td>Azure Data Factory</td>
      <td>https://{data-factory-name}.dfs.core.windows.net/</td>
    </tr>
  </tbody>
</table>]]></content><author><name>benjamin</name></author><category term="azure" /><summary type="html"><![CDATA[Como estoy estudiando para presentar el examen AZ-204 y en los cuestionarios de entrenamiento encontre preguntas donde te mostraban un fragmento de codigo que usa una cadena de conexión para algun servicio de Azure.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-az900.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-az900.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Algunos servicios de Azure y sus URL del API REST</title><link href="https://aspnetcoremaster.com/azure/servicios-de-azure-url-api-rest.html" rel="alternate" type="text/html" title="Algunos servicios de Azure y sus URL del API REST" /><published>2022-12-21T10:10:55+00:00</published><updated>2022-12-21T10:10:55+00:00</updated><id>https://aspnetcoremaster.com/azure/servicios-de-azure-url-api-rest</id><content type="html" xml:base="https://aspnetcoremaster.com/azure/servicios-de-azure-url-api-rest.html"><![CDATA[<p>Para el examen az-204 se requiere conocer la URL del API Rest de distiontos servicios de Azure. Aqui te muestro una lista que me servira como acordeon para este examen.</p>

<table>
  <thead>
    <tr>
      <th>Servicio de Azure</th>
      <th>URL de la API REST</th>
      <th>Espacio de nombres .NET SDK</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Azure Functions</td>
      <td>https://{azure-function-app-name}.azurewebsites.net/api/{function-name}</td>
      <td>Microsoft.Azure.WebJobs, Microsoft.Azure.WebJobs.Host</td>
    </tr>
    <tr>
      <td>Azure Cosmos DB</td>
      <td>https://{cosmos-db-account-name}.documents.azure.com</td>
      <td>Microsoft.Azure.Cosmos</td>
    </tr>
    <tr>
      <td>Azure Service Fabric</td>
      <td>https://management.azure.com</td>
      <td>Microsoft.ServiceFabric</td>
    </tr>
    <tr>
      <td>Azure Virtual Machines</td>
      <td>https://management.azure.com</td>
      <td>Microsoft.Azure.Management.Compute</td>
    </tr>
    <tr>
      <td>Azure Storage</td>
      <td>https://{storage-account-name}.blob.core.windows.net</td>
      <td>Microsoft.WindowsAzure.Storage</td>
    </tr>
    <tr>
      <td>Azure Event Hubs</td>
      <td>https://{event-hub-namespace-name}.servicebus.windows.net</td>
      <td>Microsoft.Azure.EventHubs</td>
    </tr>
    <tr>
      <td>Azure App Service</td>
      <td>https://management.azure.com</td>
      <td>Microsoft.Azure.Management.AppService</td>
    </tr>
    <tr>
      <td>Azure Service Bus</td>
      <td>https://{service-bus-namespace-name}.servicebus.windows.net</td>
      <td>Microsoft.Azure.ServiceBus</td>
    </tr>
    <tr>
      <td>Azure Key Vault</td>
      <td>https://{vault-name}.vault.azure.net</td>
      <td>Microsoft.Azure.KeyVault</td>
    </tr>
  </tbody>
</table>

<p>Es importante tener en cuenta que esta tabla es solo un ejemplo y hay muchos otros servicios de Azure disponibles con sus propias URLs de la API REST y clases del .NET SDK correspondientes. Además, algunos de estos servicios pueden tener más de una clase principal y pueden haber cambios en las clases y URLs de la API REST a medida que se actualizan.</p>]]></content><author><name>benjamin</name></author><category term="azure" /><summary type="html"><![CDATA[Para el examen az-204 se requiere conocer la URL del API Rest de distiontos servicios de Azure. Aqui te muestro una lista que me servira como acordeon para este examen.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-az900.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-az900.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Archivo appsettings.json ASP.NET Core</title><link href="https://aspnetcoremaster.com/asp.net/core/2022/12/13/aspnetcore-appsettings.html" rel="alternate" type="text/html" title="Archivo appsettings.json ASP.NET Core" /><published>2022-12-13T12:00:01+00:00</published><updated>2020-06-15T10:55:52+00:00</updated><id>https://aspnetcoremaster.com/asp.net/core/2022/12/13/aspnetcore%20appsettings</id><content type="html" xml:base="https://aspnetcoremaster.com/asp.net/core/2022/12/13/aspnetcore-appsettings.html"><![CDATA[<p>En este post te mostrare como leer el archivo de configuración <em>appsettings.json</em> en una aplicación de consola usando .NET Core y una aplicación web ASP.NET Core. El archivo <em>appsetting.json</em> se incluye por default en los proyectos web pero puede ser agregado fácilmente en los proyectos de bibliotecas de clases y aplicaciones de consola por lo que también te mostrare a agregar los paquetes de Nuget necesarios para esto.</p>

<p>Uno de los <a href="https://12factor.net/es/config">12 factores</a> de aplicaciones nativas de la nube establece que, se debe almacenar la configuración y ajustes de la aplicación fuera del código.</p>

<p>Generalmente se coloca en este archivo valores que pueden cambiar entre desarrollo y producción como son cadenas de conexión, configuración del nivel de Log, contraseñas de correos, clave para usar una API , licencias o algún otro valor necesario para controlar el comportamiento de la aplicación o una regla de negocio. Tener la configuración de tu aplicación en archivos externos te da la posibilidad de hacer cambios sin necesidad de volver a compilar la aplicación.</p>

<p>Si tienes experiencia con alguna versión anterior de ASP.NET es importante mencionar que anteriormente se usaba el archivo <em>WebConfig.xml</em> por lo que si estas en el proceso de migración a .NET Core tus parámetros en este archivo deberán colocarse en el <em>appsettings</em>.json_. La configuración en las aplicaciones ASP.NET sobre el .NET Framework, estaba basada unicamente en un archivo XML de gran tamaño pero en ASP.NET Core esto ha cambiado y tienes la posibilidad de agregar más fuentes de configuración.</p>

<blockquote>
  <p><strong>Nota de seguridad</strong> Generalmente es considerado una mala practica incluir información sensible como contraseñas en el archivo de configuración y colocarlas bajo control de código fuente. Se sugiere usar variables de entorno o un administrador de secretos.</p>
</blockquote>

<p>El sistema de configuración de ASP.NET Core es un sistema de capas en el que puedes agregar diferentes fuentes de configuración en el cual el orden importa ya que si dos fuentes contienen la misma clave esta sera tomada de la ultima fuente agregada.</p>

<h2 id="configuración-en-una-aplicación-net-core">Configuración en una aplicación .NET Core</h2>

<p>Para agregar un archivo de configuración a un aplicación .NET Core es necesario agregar unos paquetes de Nuget adicionales. El primer paquete necesario es <code class="language-plaintext highlighter-rouge">Microsoft.Extensions.Configuration</code>. Este paquete contiene los tipos <code class="language-plaintext highlighter-rouge">IConfiguration</code> y <code class="language-plaintext highlighter-rouge">ConfigurationBuilder</code> necesarios para manejar configurar y leer la configuración. El primero es una interfaz que se usa para  leer la configuración basada en claves y valores cuenta con Index que regresa unicamente cadenas de texto. El segundo es una clase que implementa el <strong>patrón de diseño Builder</strong> con tiene un método <code class="language-plaintext highlighter-rouge">Add</code> para agregar proveedores de configuración y un método <code class="language-plaintext highlighter-rouge">Build</code> para generar el objeto con todas las opciones.</p>

<p>Para el caso particular configuración basada en archivos <abbr lang="en" title="Javascript Object Notation">JSON</abbr> se requiere el paquete <code class="language-plaintext highlighter-rouge">Microsoft.Extensions.Configuration.Json</code> que incluye los métodos de extensión de la clase <code class="language-plaintext highlighter-rouge">ConfigurationBuilder</code> : <code class="language-plaintext highlighter-rouge">AddJsonFile</code> y <code class="language-plaintext highlighter-rouge">AddJsonStream</code> para agregar archivos JSON a la configuración al <em>ConfigurationBuilder</em>.</p>

<p>A continuación veamos un ejemplo con una aplicación de consola.</p>

<ol>
  <li>Crea una aplicación de consola con el comando <code class="language-plaintext highlighter-rouge">dotnet new console -n LeerConfiguracion</code> y abre el directorio <em>cd LeerConfiguracion</em></li>
  <li>Agrega los paquetes siguientes paquete de Nuget:</li>
</ol>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Json
``

3. Crea un archivo JSON para contener tu configuración puede contener cualquier nombre pero por simplicidad lo llamamos _appsetting.json_.

```json
{
  "llave1": "Este es el valor de la llave 1",
  "llave2": 2,
  "licencia": "ABDD-DGFH-REZG-GDDF-GGTJ",
  "api": "6437495o0503023o343443443455",
  "Condicion": true
}
</span></code></pre></div></div>

<ol>
  <li>Edita el archivo del proyecto para que al compilar el proyecto <em>LeerConfiguracion.xml</em> para especificar que el archivo json debe copiarse al al directorio de salida.</li>
</ol>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ItemGroup&gt;</span>
    <span class="nt">&lt;None</span> <span class="na">Update=</span><span class="s">"appsettings.json"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;CopyToOutputDirectory&gt;</span>Always<span class="nt">&lt;/CopyToOutputDirectory&gt;</span>
    <span class="nt">&lt;/None&gt;</span>
<span class="nt">&lt;/ItemGroup&gt;</span>
</code></pre></div></div>

<p>Con esto ya podemos leer datos del archivo de configuración por ejemplo en el método <code class="language-plaintext highlighter-rouge">Main</code> podemos ejecutar el siguiente código para obtener los datos contenidos como texto. Observa que hemos agregado dos archivos de configuración pero puedes agregar los que necesites. También observa que estamos usando un <a href="https://docs.microsoft.com/dotnet/csharp/programming-guide/indexers/">indexer</a> para extraer la información</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">Microsoft.Extensions.Configuration</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.IO</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">LeerConfiguracion</span>
<span class="p">{</span>
    <span class="k">class</span> <span class="nc">Program</span>
    <span class="p">{</span>
        <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="kt">var</span> <span class="n">builder</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">ConfigurationBuilder</span><span class="p">()</span>
              <span class="p">.</span><span class="nf">SetBasePath</span><span class="p">(</span><span class="n">Directory</span><span class="p">.</span><span class="nf">GetCurrentDirectory</span><span class="p">())</span>
              <span class="p">.</span><span class="nf">AddJsonFile</span><span class="p">(</span><span class="s">"appsettings.json"</span><span class="p">,</span> <span class="n">optional</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span> <span class="n">reloadOnChange</span><span class="p">:</span> <span class="k">true</span><span class="p">)</span>
              <span class="p">.</span><span class="nf">AddJsonFile</span><span class="p">(</span><span class="s">"archivodos.json"</span><span class="p">,</span> <span class="n">optional</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span> <span class="n">reloadOnChange</span><span class="p">:</span> <span class="k">true</span><span class="p">);</span>
            <span class="n">IConfiguration</span> <span class="n">configuration</span> <span class="p">=</span> <span class="n">builder</span><span class="p">.</span><span class="nf">Build</span><span class="p">();</span>
            
            <span class="kt">string</span> <span class="n">llave1</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">[</span><span class="s">"llave1"</span><span class="p">];</span>
            <span class="kt">string</span> <span class="n">llave2</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">[</span><span class="s">"llave2"</span><span class="p">];</span>
            <span class="kt">string</span> <span class="n">licencia</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">[</span><span class="s">"licencia"</span><span class="p">];</span>
            <span class="kt">string</span> <span class="n">api</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">[</span><span class="s">"api"</span><span class="p">];</span>
            <span class="kt">string</span> <span class="n">condicion</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">[</span><span class="s">"condicion"</span><span class="p">];</span>
            
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">llave1</span><span class="p">);</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">llave2</span><span class="p">);</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">licencia</span><span class="p">);</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">api</span><span class="p">);</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">condicion</span><span class="p">);</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">configuration</span><span class="p">[</span><span class="s">"archivo"</span><span class="p">]);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Si requieres convertir estas cadenas de texto en otros tipos de datos puedes usar el paquete de Nuget <code class="language-plaintext highlighter-rouge">Microsoft.Extensions.Configuration.Binder</code> que incluye métodos de extensión que permiten convertir los valores de la configuración en otros tipos de datos. Y podrías usar un el siguiente código para leer información:</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">bool</span> <span class="n">cond</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">.</span><span class="n">GetValue</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;(</span><span class="s">"condicion"</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">llave</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">.</span><span class="n">GetValue</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="s">"llave2"</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="configuración-en-una-aplicación-web-aspnet-core">Configuración en una aplicación web ASP.NET Core</h2>

<p>El soporte para poder manejar este archivo configuración se agrega en el archivo <em>Program.cs</em> con una llamada al método estático <code class="language-plaintext highlighter-rouge">CreateDefaultBuilder</code> de la clase <code class="language-plaintext highlighter-rouge">WebHost</code>, es decir, <code class="language-plaintext highlighter-rouge">WebHost.CreateDefaultBuilder(args)</code>.</p>

<p>Pero ¿cómo sabemos que hace este método si pertenece a ASP.NET Core ?. La respuesta es muy sencilla ya que ASP.NET Core es <em>Open Source</em> y podemos usa revisar el código de cada uno de los métodos en el <a href="https://github.com/aspnet/AspNetCore">repositorio de ASP.NET Core en Github</a>. Navegar por el código puede ser difícil porque es un proyecto muy grande por lo que he pensado que seria bueno preparar una guía pero por ahora solo basta decir que la la clase <code class="language-plaintext highlighter-rouge">WebHost</code> se encuentra <a href="https://github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs">aquí</a> y que las lineas relacionadas con el el archivo <code class="language-plaintext highlighter-rouge">appsetting.json</code> son:</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span><span class="p">.</span><span class="nf">AddJsonFile</span><span class="p">(</span><span class="s">"appsettings.json"</span><span class="p">,</span> <span class="n">optional</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span> <span class="n">reloadOnChange</span><span class="p">:</span> <span class="k">true</span><span class="p">)</span>
      <span class="p">.</span><span class="nf">AddJsonFile</span><span class="p">(</span><span class="s">$"appsettings.</span><span class="p">{</span><span class="n">env</span><span class="p">.</span><span class="n">EnvironmentName</span><span class="p">}</span><span class="s">.json"</span><span class="p">,</span> <span class="n">optional</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span> <span class="n">reloadOnChange</span><span class="p">:</span> <span class="k">true</span><span class="p">);</span>
</code></pre></div></div>

<p>Básicamente agrega la posibilidad de usar dos variantes del archivo de configuración JSON la primera es <em>appsetting.json</em> y la segunda puede finalizar con el entorno por ejemplo <em>appsetting.Production.json</em>  o appsetting.Development.json. Con esto puedes generar una sola vez los archivos para publicar tú publicación y almacenar por separado la configuración de los diferentes entornos o  clientes.</p>

<blockquote>
  <p><strong>Opinión personal :</strong> A mi gusto deberíamos tener la capacidad de ver los detalles del código de proyectos <em>open source</em> desde Visual Studio o VS Code similar cómo según recuerdo Eclipse te permite agregar el código fuente de Java y navegar en el cuando fuese necesario. Las características <strong>Ir a la definición F12</strong> y <strong>Ver la definición Alt + F12</strong> muestra unicamente los metadatos de las clases que dan alguna idea pero no el detalle.</p>
</blockquote>

<h3 id="leer-el-archivo-appsettingsjson-en-la-clase-startup">Leer el archivo appsettings.json en la clase Startup</h3>

<p>Este código es incluido en la plantilla y muestra los pasos necesario para usar la configuración en las diferentes secciones del proyecto. Se usa la inyección de dependencias para leer este archivo.</p>

<p>Primero se declara un parámetro de tipo <code class="language-plaintext highlighter-rouge">IConfiguration</code> en el constructor de la clase <code class="language-plaintext highlighter-rouge">Startup</code> y se asigna una propiedad de solo lectura llamada <code class="language-plaintext highlighter-rouge">Configuration</code> del espacio de nombres <code class="language-plaintext highlighter-rouge">Microsoft.Extensions.Configuration</code>.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">IConfiguration</span> <span class="n">Configuration</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="nf">Startup</span><span class="p">(</span><span class="n">IConfiguration</span> <span class="n">configuration</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">Configuration</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Con este código el contenedor de dependencias de ASP.NET Core se encargara de construir e inyectar un objeto de tipo <code class="language-plaintext highlighter-rouge">IConfiguration</code> cada que se utilice la clase <code class="language-plaintext highlighter-rouge">Startup</code>. Esto nos libera de tener que crear una instancia de este objeto . Solo con esto ya podemos leer el contenido del archivo <code class="language-plaintext highlighter-rouge">appsetting.json</code>.</p>

<p>Es muy común que las cadenas de conexión se guarden en el archivo <em>appsettings.json</em> ,dentro de un objeto JSON llamado <strong>ConnectionStrings</strong> puede contener más de una cadena de conexión.
En el método <code class="language-plaintext highlighter-rouge">ConfigureServices</code> nos brinda nuestro primer ejemplo como leer una cadena de conexión Configuration.<code class="language-plaintext highlighter-rouge">GetConnectionString("DefaultConnection")</code>: desde el archivo <em>appsettings.json</em>. <a href="/connectionstring/2019/02/27/cadenas-de-conexion-csharp.html">Para más detalle de como crear cadenas de conexión con C# revisa este artículo</a>.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">services</span><span class="p">.</span><span class="n">AddDbContext</span><span class="p">&lt;</span><span class="n">ApplicationDbContext</span><span class="p">&gt;(</span><span class="n">options</span> <span class="p">=&gt;</span>
         <span class="n">options</span><span class="p">.</span><span class="nf">UseSqlServer</span><span class="p">(</span><span class="n">Configuration</span><span class="p">.</span><span class="nf">GetConnectionString</span><span class="p">(</span><span class="s">"DefaultConnection"</span><span class="p">)));</span>
</code></pre></div></div>

<p>El método de extensión <code class="language-plaintext highlighter-rouge">GetConnectionString</code> requiere una clave para buscar en en el objeto JSON <em>ConnectionStrings</em>. y devuelve una cadena.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"ConnectionStrings"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"DefaultConnection"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Server=(localdb)</span><span class="se">\\</span><span class="s2">mssqllocaldb;Database=LeerAppSettings;Trusted_Connection=True;MultipleActiveResultSets=true"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"OtraBase"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Server=server2;Database=Base;Trusted_Connection=True;MultipleActiveResultSets=true"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Adicionalmente agregamos mas parámetros como ejemplo.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"Entero"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="err">,</span><span class="w">
</span><span class="nl">"Boleano"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="err">,</span><span class="w">
</span><span class="nl">"Titulo"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Titulo desde appsettings"</span><span class="err">,</span><span class="w">
</span></code></pre></div></div>

<h3 id="leer-el-archivo-appsettingsjson-en-un-controlador">Leer el archivo appsettings.json en un controlador</h3>

<p>Para leer los datos del archivo appsettings.json en un controlador agregamos una dependencias del tipo <code class="language-plaintext highlighter-rouge">IConfiguration</code> en el constructor y la asignamos a un campo privado de solo lectura llamado <code class="language-plaintext highlighter-rouge">_configuration</code>.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">readonly</span> <span class="n">IConfiguration</span> <span class="n">_configuration</span><span class="p">;</span>

<span class="k">public</span> <span class="nf">HomeController</span><span class="p">(</span><span class="n">IConfiguration</span> <span class="n">configuration</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">_configuration</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Crearemos un modelo básico para mostrar en la vista <code class="language-plaintext highlighter-rouge">Index</code>. Agrega una clase a la carpeta <em>Models</em> con el siguiente código.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">Microsoft.AspNetCore.Mvc.Rendering</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">LeerAppSettings.Models</span>
<span class="p">{</span>
  <span class="k">public</span> <span class="k">class</span> <span class="nc">IndexViewModel</span>
  <span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Titulo</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">Boleano</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Numero</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">SelectListItem</span><span class="p">&gt;</span> <span class="n">Cadenas</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Con esto construiremos un objecto al cual asignaremos los valores  del archivo de configuración.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">IActionResult</span> <span class="nf">Index</span><span class="p">()</span>
<span class="p">{</span>
  <span class="kt">var</span> <span class="n">model</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">IndexViewModel</span><span class="p">();</span>
  <span class="n">model</span><span class="p">.</span><span class="n">Numero</span> <span class="p">=</span> <span class="n">_configuration</span><span class="p">.</span><span class="n">GetValue</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="s">"Entero"</span><span class="p">);</span>
  <span class="n">model</span><span class="p">.</span><span class="n">Boleano</span> <span class="p">=</span> <span class="n">_configuration</span><span class="p">.</span><span class="n">GetValue</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;(</span><span class="s">"Boleano"</span><span class="p">);</span>
  <span class="n">model</span><span class="p">.</span><span class="n">Titulo</span> <span class="p">=</span> <span class="n">_configuration</span><span class="p">.</span><span class="n">GetValue</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;(</span><span class="s">"Titulo"</span><span class="p">);</span>
  
  <span class="n">model</span><span class="p">.</span><span class="n">Cadenas</span> <span class="p">=</span> <span class="n">_configuration</span><span class="p">.</span><span class="nf">GetSection</span><span class="p">(</span><span class="s">"ConnectionStrings"</span><span class="p">)</span>
       <span class="p">.</span><span class="nf">GetChildren</span><span class="p">()</span>
       <span class="p">.</span><span class="nf">AsEnumerable</span><span class="p">()</span>
       <span class="p">.</span><span class="nf">Select</span><span class="p">(</span><span class="n">c</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="nf">SelectListItem</span><span class="p">()</span> <span class="p">{</span> <span class="n">Value</span> <span class="p">=</span> <span class="n">c</span><span class="p">.</span><span class="n">Key</span><span class="p">,</span> <span class="n">Text</span> <span class="p">=</span> <span class="n">c</span><span class="p">.</span><span class="n">Value</span> <span class="p">})</span>
       <span class="p">.</span><span class="nf">ToList</span><span class="p">();</span>

  <span class="k">return</span> <span class="nf">View</span><span class="p">(</span><span class="n">model</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Finalmente regresaremos la vista debe tener el siguiente código para mostrar estos valores</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@model LeerAppSettings.Models.IndexViewModel

@{
    ViewData["Title"] = "Home Page";
}
<span class="nt">&lt;h1</span> <span class="na">class=</span><span class="s">"display-4"</span><span class="nt">&gt;</span>@Model.Titulo<span class="nt">&lt;/h1&gt;</span>

<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;label</span> <span class="na">asp-for=</span><span class="s">"@Model.Cadenas"</span><span class="nt">&gt;&lt;/label&gt;</span>
    <span class="nt">&lt;select</span> <span class="na">asp-items=</span><span class="s">"@Model.Cadenas"</span><span class="nt">&gt;&lt;/select&gt;</span>
<span class="nt">&lt;/div&gt;</span>

<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;label</span> <span class="na">asp-for=</span><span class="s">"@Model.Numero"</span><span class="nt">&gt;&lt;/label&gt;</span>
    <span class="nt">&lt;input</span> <span class="na">asp-for=</span><span class="s">"@Model.Numero"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;/div&gt;</span>

<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;label</span> <span class="na">asp-for=</span><span class="s">"@Model.Boleano"</span><span class="nt">&gt;&lt;/label&gt;</span>
    <span class="nt">&lt;input</span> <span class="na">asp-for=</span><span class="s">"@Model.Boleano"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;/div&gt;</span>

</code></pre></div></div>

<p><img src="/img/LeerAppsettings.webp" loading="lazy" alt="Vista que muestra los valores del archivo appssetting.json" /></p>

<h2 id="conclusión">Conclusión</h2>

<p>Como hemos visto se pueden agregar múltiples archivos de configuración a una aplicación. El equipo de ASP.NET Core decidió llamar a est archivo <strong>appsetings</strong> pero en la puede tomar cualquier otro nombre. Otra cosa que no he encontrado hasta ahora es algún método para editar de forma programática el archivo appsetting. Por el momento creo que esta pensado para ser de solo lectura. Por lo que si requiere cambios constantes para tus valores de configuración deberías pensar en otra opción.</p>]]></content><author><name>benjamin</name></author><category term="asp.net" /><category term="core" /><summary type="html"><![CDATA[El archivo de configuración appsettings.json es donde se deben colocar los valores que pueden cambiar en una aplicación.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-image.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-image.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">ASP.NET Core en NET 6 le dice Adios a la clase Startup</title><link href="https://aspnetcoremaster.com/aspnetcore/asp-net-core-dice-adios-a-la-clase-startup.html" rel="alternate" type="text/html" title="ASP.NET Core en NET 6 le dice Adios a la clase Startup" /><published>2022-10-19T12:00:01+00:00</published><updated>2022-10-19T12:00:01+00:00</updated><id>https://aspnetcoremaster.com/aspnetcore/asp-net-core-dice-adios-a-la-clase-startup</id><content type="html" xml:base="https://aspnetcoremaster.com/aspnetcore/asp-net-core-dice-adios-a-la-clase-startup.html"><![CDATA[<p>Con la novedad de que .NET 6 le dice adiós a la clase <code class="language-plaintext highlighter-rouge">StartUp</code>. Las versiones anteriores de ASP.NET Core establecieron una convención de usar una clase llamada esta <code class="language-plaintext highlighter-rouge">StartUp</code>  que incluia dos métodos <code class="language-plaintext highlighter-rouge">ConfigureServices</code> y <code class="language-plaintext highlighter-rouge">Configure</code>. Por ejemplo un proyecto de Razor Pages incluia esto en el archivo Startup.cs:</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Startup</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="nf">Startup</span><span class="p">(</span><span class="n">IConfiguration</span> <span class="n">configuration</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Configuration</span> <span class="p">=</span> <span class="n">configuration</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="n">IConfiguration</span> <span class="n">Configuration</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">ConfigureServices</span><span class="p">(</span><span class="n">IServiceCollection</span> <span class="n">services</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">services</span><span class="p">.</span><span class="nf">AddRazorPages</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Configure</span><span class="p">(</span><span class="n">IApplicationBuilder</span> <span class="n">app</span><span class="p">,</span> <span class="n">IWebHostEnvironment</span> <span class="n">env</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">env</span><span class="p">.</span><span class="nf">IsDevelopment</span><span class="p">())</span>
        <span class="p">{</span>
            <span class="n">app</span><span class="p">.</span><span class="nf">UseDeveloperExceptionPage</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="k">else</span>
        <span class="p">{</span>
            <span class="n">app</span><span class="p">.</span><span class="nf">UseExceptionHandler</span><span class="p">(</span><span class="s">"/Error"</span><span class="p">);</span>
            <span class="n">app</span><span class="p">.</span><span class="nf">UseHsts</span><span class="p">();</span>
        <span class="p">}</span>

        <span class="n">app</span><span class="p">.</span><span class="nf">UseHttpsRedirection</span><span class="p">();</span>
        <span class="n">app</span><span class="p">.</span><span class="nf">UseStaticFiles</span><span class="p">();</span>
        <span class="n">app</span><span class="p">.</span><span class="nf">UseRouting</span><span class="p">();</span>
        <span class="n">app</span><span class="p">.</span><span class="nf">UseAuthorization</span><span class="p">();</span>
        <span class="n">app</span><span class="p">.</span><span class="nf">UseEndpoints</span><span class="p">(</span><span class="n">endpoints</span> <span class="p">=&gt;</span>
        <span class="p">{</span>
            <span class="n">endpoints</span><span class="p">.</span><span class="nf">MapRazorPages</span><span class="p">();</span>
        <span class="p">});</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>La clase Program declaraba la dependicia con la clase Startup en el metodo main.
 tenía dos métodos que era configurar y configurar services estos métodos se utilizaban para agregar servicios al contenedor dependencias y para configurar la canalización HTTP y estos mismos servicios que se habían agregado.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="nf">CreateHostBuilder</span><span class="p">(</span><span class="n">args</span><span class="p">).</span><span class="nf">Build</span><span class="p">().</span><span class="nf">Run</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="n">IHostBuilder</span> <span class="nf">CreateHostBuilder</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">=&gt;</span>
        <span class="n">Host</span><span class="p">.</span><span class="nf">CreateDefaultBuilder</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
            <span class="p">.</span><span class="nf">ConfigureWebHostDefaults</span><span class="p">(</span><span class="n">webBuilder</span> <span class="p">=&gt;</span>
            <span class="p">{</span>
                <span class="n">webBuilder</span><span class="p">.</span><span class="n">UseStartup</span><span class="p">&lt;</span><span class="n">Startup</span><span class="p">&gt;();</span>
            <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Con .NET 6 ,que es una versión con soporte a largo plazo, todos los proyectos que vienen en la <strong>dotnet cli</strong> y Visual Studio 2022 ya no traen en la clase <code class="language-plaintext highlighter-rouge">StartUp</code>  por ejemplo aquí podemos ver el de web API y viene únicamente la clase Program</p>

<pre><code class="language-CS">using ConsoleApp.PostgreSQL;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllersWithViews();
builder.Services.AddDbContext&lt;BloggingContext&gt;(options =&gt; options.UseNpgsql(builder.Configuration.GetConnectionString("BloggingContext")));
var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

</code></pre>
<p>El proyecto MVC y el de Razor Pages es es la misma situación. 
Cuando nosotros vamos a revisar estos estos proyectos revisamos que ya ni siquiera entra en el método <code class="language-plaintext highlighter-rouge">Main</code> y que las dos operaciones</p>

<div class="video-responsive">
<iframe loading="lazy" src="https://www.youtube.com/embed/_gIa4v2c5IQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>]]></content><author><name>benjamin</name></author><category term="aspnetcore" /><summary type="html"><![CDATA[Con la novedad de que .NET 6 le dice adiós a la clase StartUp. Las versiones anteriores de ASP.NET Core establecieron una convención de usar una clase llamada esta StartUp que incluia dos métodos ConfigureServices y Configure. Por ejemplo un proyecto de Razor Pages incluia esto en el archivo Startup.cs:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-image.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-image.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Panel de administación :SB Admin para ASP.NET Core MVC</title><link href="https://aspnetcoremaster.com/plantillas/plantillas-panel-administracion-razor-pages.html" rel="alternate" type="text/html" title="Panel de administación :SB Admin para ASP.NET Core MVC" /><published>2022-09-28T08:00:01+00:00</published><updated>2022-09-28T08:00:01+00:00</updated><id>https://aspnetcoremaster.com/plantillas/plantillas-panel-administracion-razor-pages</id><content type="html" xml:base="https://aspnetcoremaster.com/plantillas/plantillas-panel-administracion-razor-pages.html"><![CDATA[<p>Plantilla personalizada para APS.NET Core Razor Pages basada en la plantilla <a href="https://startbootstrap.com/template/sb-admin"><em>SB Admin</em></a> 
Una plantilla HTLM de un panel de administracion con estilos personalizados. Una plantilla inicial para construir aplicaciones web, tableroa y paneles de administración.</p>

<p>Próximamente contaremos con plantillas disponibles en <a href="https://www.nuget.org/packages/BenjaminCamacho.Templates.Admin/">Nuget.org</a> para usar en tu aplicación ASP.NET Core. Puedes revisar la primera plantilla en que estamos trabajando</p>

<h1 id="descripción">Descripción</h1>

<p>SB Admin is a free, open source, MIT licensed Bootstrap admin template. Esta plantilla usa los estilos por default de Bootstrap5 con una variedad de plugins para crear un framework para la creacion de paneles de administración,aplicaciones web</p>

<h1 id="caracteristicas">Caracteristicas</h1>

<p>Localizacion en español e ingles
Gráficas interactivas con el plugin Chart.js
Tablas interactivas con el plugin dataTables
Paginas para Login, Registro, Olvido contraseña, Error 404</p>

<h1 id="instalación">Instalación</h1>

<ol>
  <li>Para instalar ejecuta el siguiente comando</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet new --install BenjaminCamacho.Templates.Admin.RazorPages::0.0.1
</code></pre></div></div>

<ol>
  <li>Para crear un proyecto con esta plantilla</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet new adminrazor -n MiProyecto
</code></pre></div></div>

<ol>
  <li>Abre la carpeta <em>MiProyecto</em> revisa los detalles de la plantilla</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd MiProyecto
dotnet run
</code></pre></div></div>

<p>Aquí un captura de pantalla de la plantilla</p>

<p><img src="/img/admin.webp" loading="lazy" alt="Captura de pantalla del Panel de administración" /></p>

<h1 id="visual-studio">Visual Studio</h1>

<p>Déspues de instalarla esta plantilla estara disponible en Visual Studio</p>

<p><img src="/img/adminrazorvs.png" loading="lazy" alt="Captura de pantalla Visual Studio para crear un nuevo proyecto" /></p>]]></content><author><name>benjamin</name></author><category term="plantillas" /><summary type="html"><![CDATA[Plantilla GRATIS para ASP.NET Core Razor Pages con Bootstrap 5 , datatable y HTML5]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/admin.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/admin.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">¿Es C# más popular que Java?</title><link href="https://aspnetcoremaster.com/csharp/2022/09/25/es-csharp-mas-popular-que-java.html" rel="alternate" type="text/html" title="¿Es C# más popular que Java?" /><published>2022-09-25T12:00:01+00:00</published><updated>2022-09-25T12:00:01+00:00</updated><id>https://aspnetcoremaster.com/csharp/2022/09/25/es-csharp-mas-popular-que-java</id><content type="html" xml:base="https://aspnetcoremaster.com/csharp/2022/09/25/es-csharp-mas-popular-que-java.html"><![CDATA[<p>C# y Java son lenguajes de programación de propósito general, populares que pueden utilizarse para crear construir aplicaciones de software</p>

<p>En este articulo tratare de responder a la pregunta ¿Es C# más popular que Java?</p>

<p>Esta pregunta esta formulada así porque yo claramente decidí usar C# como mi lenguaje de programación principal, aunque cuando decide dedicarme a la programación mi lenguaje elegido era Java. Tratare de responder esta pregunta basandome en datos y para ello revisare 3 fuentes disponibles en Internet</p>

<h2 id="encuesta-1-stackoverflow">Encuesta 1: Stackoverflow</h2>

<p><a href="https://survey.stackoverflow.co/2022/#most-popular-technologies-language">En la encuesta anual de StackOverflow del año 2022</a> en la sección de lenguajes de programación más populares. Java quedo en el Sexto Lugar mientras que C# que do en el octavo.</p>

<p><img src="/img/stackoverflowmostpoplarlang.png" loading="lazy" alt="Lenguajes de programación más populares según la encuesta de StackOverFlow 2022." /></p>

<h2 id="indice-tiobe">Indice Tiobe</h2>

<p>En <a href="https://www.tiobe.com/tiobe-index/">el índice Tiobe</a> que mide la popularidad de los lenguajes de programación Java está en la tercera posición mientras que el lenguaje C# está en la posición la 5.</p>

<p><img src="/img/tiobemostpopularlang.png" loading="lazy" alt="Lenguajes de programación más populares según el Indice Tiobe consultado en Septiembre 2022." /></p>

<h2 id="encuesta-de-jetbrains">Encuesta de JetBrains</h2>

<p><a href="https://www.jetbrains.com/lp/devecosystem-2021/#Popularity-of-programming-languages">En la encuesta anual de JetBrains del año 2021</a> en la sección de lenguajes de programación más populares Java quedo en el segundo lugar mientras que C# quedo en el septimo. Es interesante ver estos datos por región.</p>

<p><img src="/img/jetbrainsmostpopularlang.png" loading="lazy" alt="Lenguajes de programación más populares según la encuesta Encuesta Anual de JetBrains." /></p>

<h1 id="conclusión">Conclusión</h1>

<p>Ambos lenguajes de programación han existido durante bastante tiempo, ya que C# se lanzó por primera vez en 2001 y Java se remonta a 1995.</p>

<p>En 2022 sin lugar a dudas Java es más populara que C#.</p>

<div class="video-responsive">
<iframe loading="lazy" src="https://www.youtube.com/embed/Tf5h8H_iIw4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>]]></content><author><name>benjamin</name></author><category term="csharp" /><summary type="html"><![CDATA[C# y Java son lenguajes de programación de propósito general, populares que pueden utilizarse para crear construir aplicaciones de software]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/tiobemostpopularlang.png" /><media:content medium="image" url="https://aspnetcoremaster.com/img/tiobemostpopularlang.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Como instalar .NET MAUI</title><link href="https://aspnetcoremaster.com/maui/como-instalar-dotnet-maui.html" rel="alternate" type="text/html" title="Como instalar .NET MAUI" /><published>2022-06-25T12:00:01+00:00</published><updated>2022-06-25T12:24:25+00:00</updated><id>https://aspnetcoremaster.com/maui/como-instalar-dotnet-maui</id><content type="html" xml:base="https://aspnetcoremaster.com/maui/como-instalar-dotnet-maui.html"><![CDATA[<p>.NET MAUI es un nuevo framework de Microsoft para crear interfaces de usuario multiplataforma con C#.</p>

<p>Para empezar a usarlo requerimos instalar la versión preliminar 17.3 de Visual Studio 2022 en conjunto con la carga de trabajo “Desarrollo de la interfaz de usuario de aplicaciones multiplataforma con .NET”.</p>

<p><img src="/img/maui/workload.png" loading="lazy" alt="Pantalla de Visual Studio 2022 que muestra la pantalla dee instlacion de cargas" /></p>

<p>Esta instalación ocupa mas de 10 GB de espacio en tu disco duro y se toma algo de tiempo, pero lo bueno es que incluye todas las herramientas necesarias como SON SDKs, frameworsk, plantillas entre otras.</p>

<p>Cuando termine y le des en crear nuevo proyecto veras 3 nuevas plantillas para .NET MAUI.</p>

<p><img src="/img/maui/plantillas.png" loading="lazy" alt="Pantalla de Visual Studio 2022 que muestra la plantillas de .NET MAUI" /></p>

<div class="video-responsive">
<iframe loading="lazy" src="https://www.youtube.com/embed/d7Xf-ILCEf4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>]]></content><author><name>benjamin</name></author><category term="maui" /><summary type="html"><![CDATA[.NET MAUI es un nuevo framework de Microsoft para crear interfaces graficas de usuario multiplataforma con C#.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/maui/og-image.jpg" /><media:content medium="image" url="https://aspnetcoremaster.com/img/maui/og-image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="es"><title type="html">Como trabajar con base 64 con C#</title><link href="https://aspnetcoremaster.com/csharp/base-64-csharp.html" rel="alternate" type="text/html" title="Como trabajar con base 64 con C#" /><published>2022-02-17T10:00:01+00:00</published><updated>2022-02-17T10:00:01+00:00</updated><id>https://aspnetcoremaster.com/csharp/base-64-csharp</id><content type="html" xml:base="https://aspnetcoremaster.com/csharp/base-64-csharp.html"><![CDATA[<p>Para trabajar con base64 en C# asegurate de tener los espacios de nombres <code class="language-plaintext highlighter-rouge">System</code> y
<code class="language-plaintext highlighter-rouge">System.Text</code> en tu archivo o de forma global.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Text</span><span class="p">;</span>
</code></pre></div></div>

<p>Para convertir una cadena de texto a su representación en base64 puede usar alguno de los metodos de la clase <code class="language-plaintext highlighter-rouge">System.Convert</code> pero antes es necesario obtener un arreglo de <code class="language-plaintext highlighter-rouge">bytes</code> de esta cadena.</p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">string</span> <span class="n">cadena</span> <span class="p">=</span> <span class="s">"Benjamin"</span><span class="p">;</span>
<span class="kt">var</span> <span class="n">bytes</span>  <span class="p">=</span>  <span class="n">Encoding</span><span class="p">.</span><span class="n">UTF8</span><span class="p">.</span><span class="nf">GetBytes</span><span class="p">(</span><span class="n">cadena</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">base64</span> <span class="p">=</span>  <span class="n">Convert</span><span class="p">.</span><span class="nf">ToBase64String</span><span class="p">(</span><span class="n">bytes</span><span class="p">);</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span> <span class="s">$"</span><span class="p">{</span><span class="n">cadena</span><span class="p">}</span><span class="s"> en base64 es : </span><span class="p">{</span><span class="n">base64</span><span class="p">}</span><span class="s">"</span> <span class="p">);</span>
</code></pre></div></div>

<h2 id="convertir-una-imagen-a-base-64">Convertir una imagen a base 64</h2>

<p>Para convertir una imagen a su representacion en base 64 es necesario hacer uso de alguna clase  <code class="language-plaintext highlighter-rouge">Stream</code></p>

<div class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">var</span> <span class="n">stream</span> <span class="p">=</span> <span class="n">File</span><span class="p">.</span><span class="nf">OpenRead</span><span class="p">(</span><span class="s">"rutaimagen.png"</span><span class="p">);</span>
<span class="k">using</span> <span class="nn">var</span> <span class="n">ms</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">();</span>
<span class="k">await</span> <span class="n">stream</span><span class="p">.</span><span class="nf">CopyToAsync</span><span class="p">(</span><span class="n">ms</span><span class="p">);</span>
<span class="kt">byte</span><span class="p">[]</span> <span class="n">data</span> <span class="p">=</span> <span class="n">ms</span><span class="p">.</span><span class="nf">ToArray</span><span class="p">();</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">Convert</span><span class="p">.</span><span class="nf">ToBase64String</span><span class="p">(</span><span class="n">data</span><span class="p">));</span>
</code></pre></div></div>

<p>Para usar la representacion del base 64 en un elemento img en el src se usa data:image/png;base64,</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;img</span> <span class="na">alt=</span><span class="s">"Embedded QR Code"</span>  <span class="na">src=</span><span class="s">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAuQAAALkAQAAAABv3x3IAAADRElEQVR4nO3ca24bMQwEYN+g979lb9AGTTcSH1ojgYsC4acfhr22Zo0BOSNqJT1+/cP28wEdM2JGNlECGsk9+KoxgdGScaQRtupA3aSiVGubJzCDYm7JrJsZQ3OpZpnNv3t24KmK502vb+bf/z8zj9x+/L0WO7x/XF903aBjRszIJkpAI7nH5ojr45uR7u+utn7Sd2tcGzpmxIxsogQ0cpx77KVq6hpK1fK78BE6ZsSMbKIENJJ7tL6a5ncvEy8vX/NV6JgRM7KJEtDISe5xqnKvm913g44ZMSObKAGNHO4e5WZr8VLC/HPt0A06ZsSMbKIENJJ75NYVvcdCOFXNjWtDx4yYkU2UgEZOco+urbnlbn3UfV/omBEzsokS0MjZ7nGB7CuLA/q6Y7lPeKwLHTNiRjZRAho53j1SDVz4SKXu8dptrQ0dM2JGNlECGjnEPT4ubS3VsOWlW9+0Q0HHjJiRTZSARk51j2S/e9c0I7y+Xf/i+ggdM2JGNlECGsk9ood2+3TS09tkrsWQe9eGjhkxI5soAY0c5B6h9R3SzbqCGTpmxIxsogQ0knuctuPU5cHpcIjjcRTP9whBx4yYkU2UgEZ+X/cow6tw2/1a2sWTvoCOGTEjmygBjeQe0aHDfHOy3mTx5Sf7j0tX6JgRM7KJEtDIWe7x9ISIbivP6vbkXAjomBEzsokS0Mgh7pF24iS4ZdPl8P3uX0DHjJiRTZSARg53j/0W9dSJvT095RA6ZsSMbKIENHK8exSb7hw2bOVJTr4c/zQmgI4ZMSObKAGNHOMeXSvlbzi5qWygDe+gY0bMyCZKQCMnu0d04WzE/bV0s9sxAXTMiBnZRAlo5Cz3SKudUoGb1kyFHqV+ho4ZMSObKAGN5B7RnLtVUXWh8W7Yt+cYQseMmJFNlIBGTnePUuWGI5nKX7lQoGNGzMgmSkAjucfJtXeHDoukyn6eT/oqdMyIGdlECWjkN3ePcrNQuXbHUXQPXqFjRszIJkpAI7lHbkEYurOe+t0+p2yCjhkxI5soAY2c5B6vb9AxI2ZkEyWgkdyDrxoTGC0ZRxphqw7UTV9rKkrMiJlXNdmEGTEjmygBjeQer2t8FTNiRja9KcFvBJeLNfMPp0oAAAAASUVORK5CYII="</span><span class="nt">&gt;</span>
</code></pre></div></div>]]></content><author><name>benjamin</name></author><category term="csharp" /><summary type="html"><![CDATA[C# posee clases que nos permiten convertir facilmente una cadena de texto en su representacion en base64]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aspnetcoremaster.com/img/og-image.webp" /><media:content medium="image" url="https://aspnetcoremaster.com/img/og-image.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>