<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Desarrollo Web</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/desarrolloweb/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/feed.xml</link>
    <description>Este Blog nace con el propósito de compartir las experiencias que he tenido en temas relacionados con el IIS y ASP.NET</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:07:10 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>IIS: Usar Administradores como Identidad del Application Pool</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/iis-administrador-apppool</link>
      <pubDate>Mon, 28 Mar 2016 16:31:11 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/?p=383</guid>
      <description><![CDATA[Este es un escenario que he con mucha frecuencia. Si nuestra aplicación está dando problemas de...]]></description>
      <content:encoded><![CDATA[Este es un escenario que he con mucha frecuencia. Si nuestra aplicación está dando problemas de permisos o de accesos, podemos cambiar la identidad del Application Pool (en este artículo tenéis más información sobre las <a title="Application Pool Identity" href="https://www.iis.net/learn/manage/configuring-security/application-pool-identities" target="_blank">identidades del Application Pool</a>) usando un usuario que sea administrador. Primero, debemos entender cómo funcionan los permisos dentro de una aplicación en el IIS.

En primer lugar tenemos el usuario que se autentica en el IIS, que dependerá del <a href="https://www.iis.net/configreference/system.webserver/security/authentication" target="_blank">mecanismo de autenticación </a>que hayamos configurado para nuestra aplicación, por otro lado tenemos el usuario que ejecuta el proceso, que sería la Identidad del Application Pool y por último tenemos el usuario que ejecuta los hilos de .NET, que por defecto será la identidad del Application Pool a no ser que realicemos algún tipo de impersonación.

Si por ejemplo, tenemos una aplicación ASP.NET para administrar el IIS, necesitaremos que el usuario sea administrador de la máquina local, por lo que el mecanismo que comentábamos antes parece apropiado. Cambiamos la Identidad para que sea administrador de la máquina y así solventamos el posible error de permisos. Pero si leemos lo que dice <a href="https://technet.microsoft.com/en-us/library/cc771170(v=ws.10).aspx" target="_blank">este artículo</a> podemos ver que es un riesgo de seguridad:

"For example, you can specify the Local System user account, which has higher-level user rights than either the Network Service or Local Service built-in user accounts. However, remember that running an application pool under an account that has high-level user rights is a serious security risk. "

Recordemos que el usuario que ejecuta por defecto los hilos de la aplicación es la identidad del Application Pool, lo que hace que quién realice las acciones sea un administrador. Ahora pensemos en que un usuario malicioso pueda añadir código, sería el administrador el que realizaría las acciones, lo que haría que pudiese realizar cualquier tipo de acción en ese proceso, incluso adueñarse de los demás procesos de la máquina. Y estando esta máquina en dominio, podríamos llegar a una vulnerabilidad muy grave.

La recomendación es la de no tener nunca un usuario administrador como Identidad del Application Pool. Únicamente los privilegios mínimos para realizar las acciones que necesitamos. Si seguimos el ejemplo de la aplicación para administrar el IIS, podemos tener un usuario "normal" como por ejemplo AppPoolIdentity e impersonar con el usuario autenticado en las acciones que requieran permisos especiales. Así sólo los administradores realizarían las acciones que requieran permisos especiales en el momento preciso.

Por otro lado, si estáis teniendo errores de permisos, lo que os recomendaría, es que usaseis alguna herramienta de monitorización de las acciones como <a title="Process Monitor" href="https://technet.microsoft.com/en-us/sysinternals/bb896645" target="_blank">Process Monitor</a> para ver a qué recursos queremos acceder y con qué usuario lo estamos realizando.

Espero que os sirva de ayuda

-- José Ortega Gutiérrez

&nbsp;

&nbsp;

&nbsp;

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>FTP 8.5: OutOfMemory subiendo ficheros con un cliente .NET</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/ftp-8-5-outofmemory-subiendo-ficheros-con-un-cliente-net</link>
      <pubDate>Tue, 23 Feb 2016 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2016/02/23/ftp-8-5-outofmemory-subiendo-ficheros-con-un-cliente-net/</guid>
      <description><![CDATA[&nbsp;
&nbsp;
Recuerdo un caso en el que un cliente ten&iacute;a un OutOfMemory subiendo ficheros...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal" style="line-height: normal">&nbsp;</p>
<p class="MsoNormal" style="line-height: normal">&nbsp;</p>
<p class="MsoNormal" style="line-height: normal">Recuerdo un caso en el que un cliente ten&iacute;a un OutOfMemory subiendo ficheros de m&aacute;s de 1GB a un FTP usando las clases de .NET<span style="font-size: 9pt;color: black">. Recordemos que el l&iacute;mite de memoria virtual que tiene un proceso de 64 bit es de 8 TB o 128 TB en Wind</span><span style="font-size: 9pt;color: black">ows 8.1/10/2012 R2 (<a title="Memory Limits for Windows and Windows Server Releases" href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx" target="_blank"><span style="color: #0563c1">Memory Limits for Windows and Windows Server Releases</span></a>) </span></p>
<p class="MsoNormal" style="line-height: normal"><span style="font-size: 9pt;color: black">T&eacute;cnicamente es posible tener ese <span class="SpellE">OutOfMemory</span> puesto que podr&iacute;amos crear una aplicaci&oacute;n que consuma memoria hasta llegar a ese l&iacute;mite de memoria. Pero, &iquest;c&oacute;mo es posible tener ese OutOfMemory si subimos un fichero de 1.4 GB y nos quedan m&aacute;s de 120 TB libres en el proceso?</span></p>
<p class="MsoNormal" style="line-height: normal">Usando este c&oacute;digo (<a href="https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx" target="_blank">de la MSDN</a>) , veremos c&oacute;mo es posible conseguir la excepci&oacute;n subiendo el fichero:</p>
<p class="MsoNormal" style="line-height: normal">&nbsp;</p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">string</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> user = </span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">""</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">string</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> pass = </span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">""</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">string</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> file = </span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">""</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">string</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> <span class="SpellE">ftpUri</span> = </span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">""</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">try</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">if</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> (<span class="SpellE"><span class="GramE">args.Length</span></span> == 0)</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.WriteLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">"Enter username: "</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user = </span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.ReadLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">();</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.WriteLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">"Enter password: "</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pass = </span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.ReadLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">();</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.WriteLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">"Enter file name: "</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>file = </span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.ReadLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">();</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.WriteLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">"Enter FTP <span class="SpellE">URi</span>: "</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">ftpUri</span> = </span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.ReadLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">();</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">else</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user = <span class="SpellE"><span class="GramE">args</span></span><span class="GramE">[</span>0];</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pass = <span class="SpellE"><span class="GramE">args</span></span><span class="GramE">[</span>1];</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>file = <span class="SpellE"><span class="GramE">args</span></span><span class="GramE">[</span>2];</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">ftpUri</span> = <span class="SpellE"><span class="GramE">args</span></span><span class="GramE">[</span>3];</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">FtpWebRequest</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> request = (</span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">FtpWebRequest</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">)</span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">WebRequest</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.Create</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(<span class="SpellE">ftpUri</span>);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE"><span class="GramE">request.Method</span></span> = </span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">WebRequestMethods</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.</span><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Ftp</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.UploadFile</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">;</span></span><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE"><span class="GramE">request.Credentials</span></span> = </span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">new</span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">NetworkCredential</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(user, pass);</span></span><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">StreamReader</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> <span class="SpellE">sourceStream</span> = </span><span style="font-family: consolas;background: white;color: blue" lang="EN-US">new</span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">StreamReader</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(file);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af">Console</span><span style="font-family: consolas;background: white;color: black">.ReadLine</span></span><span style="font-family: consolas;background: white;color: black">();</span></span><span style="font-size: xx-small;font-family: consolas;background: white;color: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="GramE"><span style="font-family: consolas;background: white;color: blue" lang="EN-US">byte</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">[</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">] <span class="SpellE">fileContents</span> = </span><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Encoding</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.UTF8.GetBytes(<span class="SpellE">sourceStream.ReadToEnd</span>());</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">sourceStream.Close</span>();</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE"><span class="GramE">request.ContentLength</span></span> = <span class="SpellE">fileContents.Length</span>;</span><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Stream</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> <span class="SpellE">requestStream</span> = <span class="SpellE"><span class="GramE">request.GetRequestStream</span></span>();</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">requestStream.Write</span>(<span class="SpellE">fileContents</span>, 0, <span class="SpellE">fileContents.Length</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: black">requestStream.Close</span></span><span style="font-family: consolas;background: white;color: black">();</span></span><span style="font-size: xx-small;font-family: consolas;background: white;color: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af">FtpWebResponse</span></span><span style="font-family: consolas;background: white;color: black"> response = (</span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af">FtpWebResponse</span></span><span style="font-family: consolas;background: white;color: black">)<span class="SpellE"><span class="GramE">request.GetResponse</span></span>();</span></span><span style="font-size: xx-small;font-family: consolas;background: white;color: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.WriteLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">"Upload File Complete, status {0}"</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">, <span class="SpellE"><span class="GramE">response.StatusDescription</span></span>);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE"><span class="GramE">response.Close</span></span>();</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="GramE"><span style="font-family: consolas;background: white;color: blue" lang="EN-US">catch</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span></span><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Exception</span><span style="font-family: consolas;background: white;color: black" lang="EN-US"> ex)</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small;font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Console</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.WriteLine</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">(</span><span style="font-family: consolas;background: white;color: #a31515" lang="EN-US">"An exception has occurred: {0}"</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">, <span class="SpellE"><span class="GramE">ex.Message</span></span>);</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: consolas;background: white;color: black">}</span></span></p>
<p class="MsoNormal" style="line-height: normal"><span style="font-size: 9pt;font-family: 'Arial',sans-serif;color: black" lang="EN-US"> <br /></span></p>
<p class="MsoNormal" style="line-height: normal"><span style="font-size: 9pt;color: black" lang="EN-US">Como dec&iacute;a, ejecutando este c&oacute;digo, tendremos una OutOfMemoryException, concretamente cuando intentemos convertir el Stream del fichero que queremos subir a un array de bytes:</span></p>
<p class="MsoNormal" style="line-height: normal">&nbsp;</p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal"><span style="font-size: xx-small"><span style="font-family: consolas;background: white;color: black" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="GramE"><span style="font-family: consolas;background: white;color: blue" lang="EN-US">byte</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">[</span></span><span style="font-family: consolas;background: white;color: black" lang="EN-US">] <span class="SpellE">fileContents</span> = </span><span style="font-family: consolas;background: white;color: #2b91af" lang="EN-US">Encoding</span><span style="font-family: consolas;background: white;color: black" lang="EN-US">.UTF8.GetBytes(<span class="SpellE">sourceStream.ReadToEnd</span>());</span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal">&nbsp;</p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal">Si hemos adjuntado un depurador, veremos algo como esto:</p>
<p class="MsoNormal" style="margin-bottom: 0pt;line-height: normal">&nbsp;</p>
<p class="MsoNormal" style="margin-bottom: 0pt;padding-left: 30px;line-height: normal"><span style="font-size: x-small;font-family: courier new,courier"># Call Site</span> <br /><span style="font-size: x-small;font-family: courier new,courier">00 KERNELBASE!RaiseException</span> <br /><span style="font-size: x-small;font-family: courier new,courier">01 clr!DllCanUnloadNowInternal</span> <br /><span style="font-size: x-small;font-family: courier new,courier">02 clr!TranslateSecurityAttributes</span> <br /><span style="font-size: x-small;font-family: courier new,courier">03 clr!NGenCreateNGenWorker</span> <br /><span style="font-size: x-small;font-family: courier new,courier">04 mscorlib_ni!System.Text.StringBuilder.ToString()</span> <br /><span style="font-size: x-small;font-family: courier new,courier">05 FTPClient!FTPCLient.Main(System.String[])</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt;padding-left: 30px;line-height: normal">&nbsp;</p>
<p>Lo que ocurre es que estamos convirtiendo un fichero muy grande en el array de bytes directamente. Lo recomendado ser&iacute;a usar un buffer para evitar este comportamiento: <a href="https://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest(v=vs.110).aspx" target="_blank">Subir ficheros con buffer</a></p>
<p>Tambi&eacute;n podemos usar los objetos muy grandes de .NET (como menciono en este otro art&iacute;culo: <a title="OutOfMemoryException al manejar StringBuilder en un proceso de 64 bits" href="https://blogs.msdn.com/b/desarrolloweb/archive/2016/02/17/stringbuilder-outofmemory.aspx" target="_blank">OutOfMemoryException al manejar StringBuilder en un proceso de 64 bits</a><a title="OutOfMemoryException al manejar StringBuilder en un proceso de 64 bits" href="https://blogs.msdn.com/b/desarrolloweb/archive/2016/02/17/stringbuilder-outofmemory.aspx" target="_blank">https://blogs.msdn.com/b/desarrolloweb/archive/2016/02/17/stringbuilder-outofmemory.aspx</a>)&nbsp;</p>
<p>Espero que os sirva.</p>
<p>-- Jos&eacute; Ortega Guti&eacute;rrez</p>]]></content:encoded>
    </item>
    <item>
      <title>OutOfMemoryException al manejar StringBuilder en un proceso de 64 bits</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/outofmemoryexception-al-manejar-stringbuilder-en-un-proceso-de-64-bits</link>
      <pubDate>Wed, 17 Feb 2016 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2016/02/17/outofmemoryexception-al-manejar-stringbuilder-en-un-proceso-de-64-bits/</guid>
      <description><![CDATA[&#160;  ¿Es posible tener un OutOfMemory con un proceso que tenga menos de 5GB de memoria virtual,...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p><span style="font-size: small; font-family: calibri">¿Es posible tener un OutOfMemory con un proceso que tenga menos de 5GB de memoria virtual, sin fragmentación aparente y que se (obviamente) se ejecute en 64 bits?</span></p>  <p><span style="font-size: small; font-family: calibri">Gracias a determinados usos de StringBuilder sí podemos tenerlo. Con este pequeño código conseguiremos tener nuestro deseado OutOfMemory y el proceso tendrá un consumo de 4,5 GB</span></p>  <p><span style="font-size: xx-small; font-family: consolas">&#160; </span><span style="font-size: x-small"><span lang="EN-US" style="font-family: consolas; background: white; color: blue"><span style="font-size: xx-small">string void</span></span><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="font-size: xx-small"> main(<span lang="EN-US" style="font-family: consolas; background: white; color: blue"><span style="font-size: xx-small">string</span></span>[] args)</span></span></span></p>  <p><span style="font-size: x-small">&#160;&#160; {</span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: xx-small"><span style="font-size: x-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span><span lang="EN-US" style="font-family: consolas; background: white; color: blue">const string </span><span lang="EN-US" style="font-family: consolas; background: white; color: black">lala = </span><span lang="EN-US" style="font-family: consolas; background: white; color: #a31515">&quot;lalalalalalalalalalalalalalalalalalalalala&quot;</span><span lang="EN-US" style="font-family: consolas; background: white; color: black">;</span></span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: xx-small"><span style="font-size: x-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="SpellE"><span lang="EN-US" style="font-family: consolas; background: white; color: #2b91af">StringBuilder </span></span></span></span><span lang="EN-US" style="font-family: consolas; background: white; color: black">sb = <span style="color: #0000ff">new </span><span class="SpellE"><span lang="EN-US" style="font-family: consolas; background: white; color: #2b91af">StringBuilder</span></span></span><span lang="EN-US" style="font-family: consolas; background: white; color: black">();</span></span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: xx-small"><span style="font-size: x-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span><span lang="EN-US" style="font-family: consolas; background: white; color: blue">for (int </span><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span class="SpellE">i = 0; i &lt; <span style="color: #0000ff">int.</span>MaxValue/2; i++)</span></span></span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: x-small"><span lang="EN-US" style="font-size: xx-small; font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>{</span><span lang="EN-US" style="font-size: xx-small; font-family: consolas; background: white; color: black">&#160;</span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: x-small"><span style="font-size: xx-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span class="SpellE"><span class="GramE">sb.Append(lala);</span></span></span></span><span lang="EN-US" style="font-size: xx-small; font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span></span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: x-small"><span style="font-size: xx-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span><span class="SpellE"><span lang="EN-US" style="font-family: consolas; background: white; color: #2b91af">Console</span><span lang="EN-US" style="font-family: consolas; background: white; color: black">.WriteLine</span></span><span lang="EN-US" style="font-family: consolas; background: white; color: black">(<span style="color: #0000ff">string<span style="color: #000000">.Format(</span></span></span><span lang="EN-US" style="font-family: consolas; background: white; color: #a31515">&quot;Longitud de la cadenaEnter username: {0} &quot;</span><span lang="EN-US" style="font-family: consolas; background: white; color: black">, sb.ToString().Length));</span></span><span style="font-size: xx-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span></span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span lang="EN-US" style="font-size: xx-small; font-family: consolas; background: white; color: black"><span style="font-size: x-small"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>}</span></span></p>  <p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: xx-small"><span style="font-size: x-small"><span lang="EN-US" style="font-family: consolas; background: white; color: black"><span style="mso-spacerun: yes">&#160;&#160; </span></span><span style="font-family: consolas; background: white; color: black">}</span></span></span></p>  <p><span style="font-size: xx-small; font-family: consolas">&#160; </span></p>  <p><span style="font-size: small; font-family: calibri">¿Cuál es el motivo si tenemos más de 127 TB libres?. Para descubrirlo, tenemos que ahondar en lo que ocurre cuando salta la excepción. Vemos el método que causa la excepción <strong>ExpandByABlock</strong>, que se usa cuando el objeto StringBuilder piensa que se ha llenado el último <strong>chunk</strong> de información y tenemos que pasar a uno nuevo:</span></p>  <blockquote>   <p><span style="font-size: x-small; font-family: consolas">0:000&gt; kc        <br /># Call Site         <br />00 clr!IL_Throw         <br />01 mscorlib_ni!System.Text.StringBuilder.ExpandByABlock(Int32)         <br />02 mscorlib_ni!System.Text.StringBuilder.Append(Char*, Int32)         <br />03 mscorlib_ni!System.Text.StringBuilder.AppendHelper(System.String)         <br />04 mscorlib_ni!System.Text.StringBuilder.Append(System.String)         <br />05 consoleapplication2!ConsoleApplication2.Program.Main(System.String[])         <br />06 clr!CallDescrWorkerInternal         <br />07 clr!CallDescrWorkerWithHandler         <br />08 clr!MethodDescCallSite::CallTargetWorker         <br />09 clr!MethodDescCallSite::Call         <br />0a clr!RunMain         <br />0b clr!Assembly::ExecuteMainMethod         <br />0c clr!SystemDomain::ExecuteMainMethod         <br />0d clr!ExecuteEXE         <br />0e clr!_CorExeMainInternal         <br />0f clr!_CorExeMain         <br />10 mscoreei!_CorExeMain         <br />11 mscoree!ShellShim__CorExeMain         <br />12 mscoree!_CorExeMain_Exported         <br />13 kernel32!BaseThreadInitThunk         <br />14 ntdll!RtlUserThreadStart         <br /></span></p>    <p>&#160;</p> </blockquote>  <p><span style="font-size: small; font-family: calibri">Estupendo, pero esto no explica el motivo por el que falla. Así que tenemos que ver qué hace este método. La información pública la tenemos aquí: </span><a href="https://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,bb3473794f7408f5"><span style="font-size: small; font-family: calibri">https://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,bb3473794f7408f5</span></a>&#160;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c"><font size="1" face="Consolas">///</font></span><font face="Consolas"><font size="1"><span class="c">&lt;</span><span class="c">summary</span><span class="c">&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">///</span><span class="c"> Assumes that 'this' is the last chunk in the list and that it is full. Upon return the 'this'</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">///</span><span class="c"> block is updated so that it is a new block that has at least 'minBlockCharCount' characters.</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">///</span><span class="c"> that can be used to copy characters into it. </span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">///</span><span class="c">&lt;/</span><span class="c">summary</span><span class="c">&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>private void</strong> </font></font><a id="bb3473794f7408f5" href="https://referencesource.microsoft.com/mscorlib/R/bb3473794f7408f5.html" target="n" data-glyph="76,1"><font size="1" face="Consolas">ExpandByABlock</font></a><font size="1" face="Consolas">(<strong>int</strong> <span id="r295 rd" class="r295 r">minBlockCharCount</span>)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/P/c575dbe300e57438.html#c575dbe300e57438"><font size="1" face="Consolas">Contract</font></a><font size="1" face="Consolas">.</font><a href="https://referencesource.microsoft.com/mscorlib/system/diagnostics/contracts/contracts.cs.html#ed8c78e4783a0eaf"><font size="1" face="Consolas">Requires</font></a><font size="1" face="Consolas">(</font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#7529ccd440df5320"><font size="1" face="Consolas">Capacity</font></a><font size="1" face="Consolas"> == </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#7d7729bd88adac53"><font size="1" face="Consolas">Length</font></a><font size="1" face="Consolas">, <span class="s">&quot;Expand expect to be called only when there is no space left&quot;</span>);&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// We are currently full</span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/P/c575dbe300e57438.html#c575dbe300e57438"><font size="1" face="Consolas">Contract</font></a><font size="1" face="Consolas">.</font><a href="https://referencesource.microsoft.com/mscorlib/system/diagnostics/contracts/contracts.cs.html#ed8c78e4783a0eaf"><font size="1" face="Consolas">Requires</font></a><font size="1" face="Consolas">(<span class="r295 r">minBlockCharCount</span> &gt; 0, <span class="s">&quot;Expansion request must be positive&quot;</span>);      <br />      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#6c5dd226a8280a25"><font size="1" face="Consolas">VerifyClassInvariant</font></a><font size="1" face="Consolas">();     <br />      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>if</strong> ((<span class="r295 r">minBlockCharCount</span> + </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#7d7729bd88adac53"><font size="1" face="Consolas">Length</font></a><font size="1" face="Consolas">) &gt; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#69d20c3a80fca140"><font size="1" face="Consolas">m_MaxCapacity</font></a><font size="1" face="Consolas">)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>throw</strong> <strong>new</strong> </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/system/argumentoutofrangeexception.cs.html#27138d3b17d5ff6b"><font size="1" face="Consolas">ArgumentOutOfRangeException</font></a><font size="1" face="Consolas">(<span class="s">&quot;requiredLength&quot;</span>, </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/system/environment.cs.html#7d2f1469d916fc63"><font size="1" face="Consolas">Environment</font></a><font size="1" face="Consolas">.</font><a href="https://referencesource.microsoft.com/mscorlib/system/environment.cs.html#cc89c53dab5e83c0"><font size="1" face="Consolas">GetResourceString</font></a><font size="1" face="Consolas">(<span class="s">&quot;ArgumentOutOfRange_SmallCapacity&quot;</span>));      <br />      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// Compute the length of the new block we need </span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// We make the new chunk at least big enough for the current need (minBlockCharCount)</span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// But also as big as the current length (thus doubling capacity), up to a maximum</span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// (so we stay in the small object heap, and never allocate really big chunks even if</span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// the string gets really big. </span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>int</strong> <span id="r296 rd" class="r296 r">newBlockLength</span> = </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/system/math.cs.html#a4407e67b9a5afad"><font size="1" face="Consolas">Math</font></a><font size="1" face="Consolas">.</font><a href="https://referencesource.microsoft.com/mscorlib/system/math.cs.html#80ff956e9ca8e414"><font size="1" face="Consolas">Max</font></a><font size="1" face="Consolas">(<span class="r295 r">minBlockCharCount</span>, </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/system/math.cs.html#a4407e67b9a5afad"><font size="1" face="Consolas">Math</font></a><font size="1" face="Consolas">.</font><a href="https://referencesource.microsoft.com/mscorlib/system/math.cs.html#f441d55c88d635ad"><font size="1" face="Consolas">Min</font></a><font size="1" face="Consolas">(</font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#7d7729bd88adac53"><font size="1" face="Consolas">Length</font></a><font size="1" face="Consolas">, </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#30d3e689001e9223"><font size="1" face="Consolas">MaxChunkSize</font></a><font size="1" face="Consolas">));     <br />      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// Copy the current block to the new block, and initialize this to point at the new buffer. </span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#b1aeb75d788989a5"><font size="1" face="Consolas">m_ChunkPrevious</font></a><font size="1" face="Consolas"> = <strong>new</strong> </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#cce7345d4e194923"><font size="1" face="Consolas">StringBuilder</font></a><font size="1" face="Consolas">(</font><a class="k" href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#adf60ee46ebd299f"><font size="1" face="Consolas">this</font></a><font size="1" face="Consolas">);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#bc9e2893d06a2166"><font size="1" face="Consolas">m_ChunkOffset</font></a><font size="1" face="Consolas"> += </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#713b3ae81c184340"><font size="1" face="Consolas">m_ChunkLength</font></a><font size="1" face="Consolas">;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#713b3ae81c184340"><font size="1" face="Consolas">m_ChunkLength</font></a><font size="1" face="Consolas"> = 0;     <br />      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="c">// Check for integer overflow (logical buffer size &gt; int.MaxInt)</span>      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font style="background-color: #ffff00" color="#ff0000"> <strong>if</strong> (</font></font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#bc9e2893d06a2166"><font style="background-color: #ffff00" color="#ff0000" size="1" face="Consolas">m_ChunkOffset</font></a><font size="1" face="Consolas"><font style="background-color: #ffff00" color="#ff0000"> + <span class="r296 r">newBlockLength</span> &lt; <span class="r296 r">newBlockLength</span>)        <br /></font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#b2388a2b6bffa84b"><font size="1" face="Consolas">m_ChunkChars</font></a><font size="1" face="Consolas"> = <strong>null</strong>;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>throw</strong> <strong>new</strong> </font><a class="t" href="https://referencesource.microsoft.com/mscorlib/system/outofmemoryexception.cs.html#11bcfd9ad4159d54"><font size="1" face="Consolas">OutOfMemoryException</font></a><font size="1" face="Consolas">();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#b2388a2b6bffa84b"><font size="1" face="Consolas">m_ChunkChars</font></a><font size="1" face="Consolas"> = <strong>new</strong> <strong>char</strong>[<span class="r296 r">newBlockLength</span>];      <br />      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><a href="https://referencesource.microsoft.com/mscorlib/system/text/stringbuilder.cs.html#6c5dd226a8280a25"><font size="1" face="Consolas">VerifyClassInvariant</font></a><font size="1" face="Consolas">();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>  <p>&#160;</p>  <p><span style="font-size: small; font-family: calibri">Si vamos paso a paso en nuestro proceso, veremos que cuando falla, los valores del StringBuilder son estos. Nos vamos a fijar especialmente en m_ChuckLength:</span></p>  <blockquote>   <p><span style="font-size: x-small; font-family: consolas">Name:&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Text.StringBuilder        <br />…         <br />Fields:         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Type VT&#160;&#160;&#160;&#160; Attr&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Value Name         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Char[]&#160; 0 instance 0000000000000000 m_ChunkChars         <br />...ext.StringBuilder&#160; 0 instance 00000234eae27fc8 m_ChunkPrevious         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Int32&#160; 1 instance&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff0000; background-color: #ffff00">0 m_ChunkLength          <br /></span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Int32&#160; 1 instance&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff0000; background-color: #ffff00">2147481216 m_ChunkOffset          <br /></span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Int32&#160; 1 instance&#160;&#160;&#160;&#160;&#160;&#160; 2147483647 m_MaxCapacity</span></p> </blockquote>  <p>&#160;</p>  <p><span style="font-size: small; font-family: calibri">Tenemos un apartado en el que nos dice que la suma de <strong>m_ChunkOffset + newBlockLenght</strong> sea menor que <strong>newBlockLength</strong>. Estamos frente a otra incongruencia, ¿cómo es posible que la suma de un valor positivo más otro valor positivo sea menor que el primer valor?. No es tan incongruente, pensemos que hemos sobrepasado el límite máximo de un valor entero, por lo que el valor resultante, cogiendo sólo los dígitos de int64, es inferior.</span></p>  <p><span style="font-size: small; font-family: calibri">Vemos los valores que vamos a ir teniendo <strong>m_ChunkOffset </strong>tiene un valor de 2147481216 y trans comprobar la operación de Math.Max tenemos que el valor de <strong>newBlockLength</strong> es 8000. Esto implica que la suma de ambos es 2147489216, pero como el valor es mayor que int.MaxValue, nos hemos pasado y nos vamos a quedar con un valor real de 5569, que es menor que los 8000 de <strong>newBlockLength, </strong>así que acabamos lanzando un <strong>OutOfMemoryException</strong> porque hemos llegado al límite de StringBuilder.</span></p>  <p><span style="font-size: small; font-family: calibri">Tened en cuenta que estamos tratando con un valor máximo de un objeto de 2GB, por lo que nuestro String debería ser más pequeño. Para objetos más grandes, tenemos esta propiedad </span><a title="https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx" href="https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx" target="_blank"><span style="font-size: small; font-family: calibri">gcAllowVeryLargeObjects</span></a><span style="font-size: small; font-family: calibri"> que nos permite que los arrays superen el límite de 2GB.</span></p>  <p><span style="font-size: small; font-family: calibri">Espero que os sirva de ayuda</span></p>  <p><span style="font-size: small; font-family: calibri">- José Ortega Gutiérrez</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Procesos de Session 0 y cuadros de diálogo</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/procesos-de-session-0-y-cuadros-de-dilogo</link>
      <pubDate>Tue, 13 Oct 2015 08:48:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2015/10/13/procesos-de-session-0-y-cuadros-de-dilogo/</guid>
      <description><![CDATA[Este es un patr&oacute;n que vemos con mucha frecuencia, procesos que se vuelven lentos o dejan de...]]></description>
      <content:encoded><![CDATA[<p>Este es un patr&oacute;n que vemos con mucha frecuencia, procesos que se vuelven lentos o dejan de responder de forma inesperada.</p>
<p>Esto puede deberse a que estamos empleando cuadros de di&aacute;logo en un proceso de Session 0. Cuando un usuario se autentica en una m&aacute;quina Windows, se crea un Session ID, empezando por el 1, quedando reservado el 0 para los servicios y procesos que ejecuta el sistema operativo.</p>
<p>Por lo que estos procesos no se ejecutan en un escritorio, no teniendo interacci&oacute;n directa con el usuario con ventanas. &iquest;Qu&eacute; ocurre si a&ntilde;adimos una ventana a uno de estos procesos?, pues que no tendremos a un usuario que pueda interaccionar con ella, por lo que si la ventana est&aacute; en espera a que el usuario haga click en alg&uacute;n bot&oacute;n, pero no tenemos usuario, el hilo que tiene esa petici&oacute;n quedar&aacute; bloqueado esperando una respuesta que nunca llegar&aacute;.</p>
<p>Ese es el motivo por el que no podemos tener cuadros de di&aacute;logo en una aplicaci&oacute;n que est&aacute; en la sesi&oacute;n 0, porque afecta al rendimiento de la aplicaci&oacute;n pudiendo hacer que se llegue a bloquear el proceso.</p>
<p>&nbsp;</p>
<p>Espero que os sirva de ayuda.</p>
<p>- Jos&eacute; Ortega Guti&eacute;rrez</p>]]></content:encoded>
    </item>
    <item>
      <title>Web Farm Framework: WebAgentService.exe consume mucha memoria</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/web-farm-framework-webagentservice-exe-consume-mucha-memoria</link>
      <pubDate>Wed, 25 Sep 2013 02:09:02 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2013/09/25/web-farm-framework-webagentservice-exe-consume-mucha-memoria/</guid>
      <description><![CDATA[Imaginemos este escenario, tenemos una Web Farm Framework 2.2 formada por:  · 2 Controllers: Windows...]]></description>
      <content:encoded><![CDATA[<p>Imaginemos este escenario, tenemos una Web Farm Framework 2.2 formada por:</p>  <p>· 2 Controllers: Windows 2008 R2</p>  <p>· 1 Primario: Windows 2008 R2</p>  <p>· Varios Secundarios: Windows 2008 R2</p>  <p>Poco a poco, el consumo de memoria en el WebFarmservice.exe está aumentando en los controllers y en algunos secundarios llegando hasta el punto de tener que reiniciar los servidores para solventarlo.</p>  <p>Para ver que ocurre, lo más fácil es revisar el comportamiento que estamos teniendo tal y como os conté en este post: <a title="https://blogs.msdn.com/b/desarrolloweb/archive/2012/05/06/asp-net-problemas-rendimiento.aspx" href="https://blogs.msdn.com/b/desarrolloweb/archive/2012/05/06/asp-net-problemas-rendimiento.aspx">https://blogs.msdn.com/b/desarrolloweb/archive/2012/05/06/asp-net-problemas-rendimiento.aspx</a></p>  <p>Pero en este caso veremos cómo el leak de memoria está en memoria nativa, por lo que necesitaríamos otro plan de acción</p>  <p><strong>Día 1</strong></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;"></font></span></p>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Free&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 193&#160;&#160;&#160;&#160;&#160; 7ff`c6796000 (&#160;&#160; 7.999 Tb)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 99.99%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">.NET&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 144&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`1ac7a000 ( 428.477 Mb)&#160; 46.56%&#160;&#160;&#160; 0.01%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><font style="background-color: rgb(255, 255, 0);"><span><font style="font-size: 9pt;">Heap&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 97&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`16921000 ( </font></span><font style="font-size: 9pt;"><span style="background-image: none; background-attachment: scroll; background-repeat: repeat; background-size: auto; background-origin: padding-box; background-clip: border-box; mso-highlight: yellow;">361.129</span></font><span><font style="font-size: 9pt;"> Mb)&#160; 39.24%&#160;&#160;&#160; 0.00%</font></span></font></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 763&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`069da000 ( 105.852 Mb)&#160; 11.50%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Stack&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 80&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`01700000 (&#160; 23.000 Mb)&#160;&#160; 2.50%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Other&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 13&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`001b6000 (&#160;&#160; 1.711 Mb)&#160;&#160; 0.19%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span lang="ES" style="mso-ansi-language: es;"><font style="font-size: 9pt;">TEB&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 23&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`0002e000 ( 184.000 kb)&#160;&#160; 0.02%&#160;&#160;&#160; 0.00%</font></span><span lang="ES" style="mso-ansi-language: es;"></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span lang="ES" style="mso-ansi-language: es;"><font style="font-size: 9pt;">PEB&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`00001000 (&#160;&#160; 4.000 kb)&#160;&#160; 0.00%&#160;&#160;&#160; 0.00%</font></span><span lang="ES" style="mso-ansi-language: es;"></span></p> <font style="font-size: 12pt;"></font>  <p>&#160;</p>  <p><strong>Día 5</strong></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Free&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160;&#160;&#160;&#160; 7ff`91d80000 (&#160;&#160; 7.998 Tb)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 99.98%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><font style="background-color: rgb(255, 255, 0);"><span><font style="font-size: 9pt;">Heap&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 189&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`4b031000 (&#160;&#160; </font></span><font style="font-size: 9pt;"><span style="background-image: none; background-attachment: scroll; background-repeat: repeat; background-size: auto; background-origin: padding-box; background-clip: border-box; mso-highlight: yellow;">1.172</span><span> </span></font><span><font style="font-size: 9pt;">Gb)&#160; 68.10%&#160;&#160;&#160; 0.01%</font></span></font></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">.NET&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 144&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`1ac7a000 ( 428.477 Mb)&#160; 24.31%&#160;&#160;&#160; 0.01%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 755&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`069da000 ( 105.852 Mb)&#160;&#160; 6.01%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Stack&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 91&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`01a00000 (&#160; 26.000 Mb)&#160;&#160; 1.48%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">Other&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 13&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`001b6000 (&#160;&#160; 1.711 Mb)&#160;&#160; 0.10%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">TEB&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`00034000 ( 208.000 kb)&#160;&#160; 0.01%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">PEB&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0`00001000 (&#160;&#160; 4.000 kb)&#160;&#160; 0.00%&#160;&#160;&#160; 0.00%</font></span></p> <font style="font-size: 12pt;"></font>  <p>&#160;</p>  <p>Por lo que en este caso podemos usar LeakTrace para saber quién está haciendo las alocaciones de memoria por ejemplo usando DebugDiag</p>  <p>&#160;</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/3603.image_15D84ECF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/3603.image_5F00_15D84ECF.png"><img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/0728.image_thumb_1493B5F0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/0728.image_5F00_thumb_5F00_1493B5F0.png" width="424" height="373" /></a></p>  <p>&#160;</p>  <p>Examinando los volcados podremos ver quién no está liberando la memoria que usa. Si vemos un escenario parecido a este:</p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">msvcrt!malloc+70&#160;&#160; </font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!operator new+23&#160;&#160; </font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!SCHEMA_ELEMENT::Clone+3f</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!SCHEMA_ELEMENT::CreateElementObject+8d3</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!SCHEMA_ELEMENT::CreateElementObject+973</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!SCHEMA_ENTRY::CreateConfigElement+c9</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_SECTION::ParseConfigSetting+29e</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!SECTION_GROUP_TABLE::ParseConfigSetting+2fa</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_FILE::ParseLocation+2ba</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_FILE::ParseTopLevelElements+493</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_FILE::ParseDom+d9 </font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_FILE::ParseConfigFile+247</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_CACHE::ParseConfigFile+3e</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_CACHE::CacheMiss+a699&#160;&#160;&#160;&#160;&#160;&#160; </font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_CACHE::ProcessConfigPath+4b25&#160;&#160;&#160;&#160;&#160;&#160; </font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_CACHE::GetConfigFileList+40</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">nativerd!CONFIG_SYSTEM::GetConfigSectionInternal+1f2</font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span style="background-image: none; background-attachment: scroll; background-repeat: repeat; background-size: auto; background-origin: padding-box; background-clip: border-box; mso-highlight: yellow;"><font style="font-size: 9pt;">nativerd!CONFIG_SYSTEM::GetAdminSection</font></span><span><font style="font-size: 9pt;">+b5&#160; </font></span></p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in;"><span><font style="font-size: 9pt;">mscorwks!DoCLRToCOMCall+177</font></span></p> <font style="font-size: 12pt;"></font>  <p>&#160;</p>  <p>En este artículo podemos ver como versiones anteriores de nativerd puede provocar un memory leak al no liberar memoria. Aunque describe otro escenario, el comportamiento que describe es el mismo: <a href="https://support.microsoft.com/kb/2618982">https://support.microsoft.com/kb/2618982</a></p>  <p>Instalando el hotfix debería solucionarse el problema.</p>  <p>&#160;</p>  <p>Espero que os sirva de ayuda.</p>  <p>- José Ortega Gutiérrez</p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET: ¿Es realmente perjudicial el modo debug?</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/asp-net-es-realmente-perjudicial-el-modo-debug</link>
      <pubDate>Wed, 22 May 2013 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2013/05/22/asp-net-es-realmente-perjudicial-el-modo-debug/</guid>
      <description><![CDATA[Aunque es un tema muy comentado, quiero hacer hincapi&eacute; sobre los problemas de rendimiento del...]]></description>
      <content:encoded><![CDATA[<p>Aunque es un tema muy comentado, quiero hacer hincapi&eacute; sobre los problemas de rendimiento del modo debug. El motivo es que seguimos encontrando muchos casos en los que en modo debug est&aacute; afectando gravemente al rendimiento de las aplicaciones.</p>
<p>En estos art&iacute;culos <a title="https://support.microsoft.com/kb/2580348" href="https://support.microsoft.com/kb/2580348" target="_blank">https://support.microsoft.com/kb/2580348</a> y&nbsp; <a title="https://blogs.msdn.com/b/tess/archive/2006/04/13/575364.aspx" href="https://blogs.msdn.com/b/tess/archive/2006/04/13/575364.aspx" target="_blank">https://blogs.msdn.com/b/tess/archive/2006/04/13/575364.aspx</a> tenemos informaci&oacute;n sobre las acciones que realizan cuando se activa el modo debug:</p>
<ol>
<li>Code will execute slower due to additional debug paths being enabled.</li>
<li>Compilation will take longer because additional debug information is being generated, such as symbol (.pdb) files.</li>
<li>Execution timeout is extended to 30,000,000 seconds.</li>
<li>Scripts and images downloaded from the WebResource.axd and ScriptResource.axd handlers are not cached.</li>
<li>Code optimization is disabled.</li>
</ol>
<p>&iquest;Cu&aacute;les son los efectos pr&aacute;cticos de tener habilitado el modo debug en nuestras aplicaciones? Al final el resultado es que nuestra aplicaci&oacute;n se va a tardar m&aacute;s en realizar las mismas acciones que si no estuviese el debug habilitado.</p>
<p>En este sencillo ejemplo podemos ver una operaci&oacute;n que tiene varias iteraciones. El c&oacute;digo captura el tiempo antes de realizar unas iteraciones y justo despu&eacute;s de que terminen. Podemos ver que si el modo debug est&aacute; habilitado y las librer&iacute;as est&aacute;n compiladas en como debug, el tiempo de ejecuci&oacute;n de la secuencia es de 29 segundos.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/3806.image_333F1E77.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/3806.image_5F00_333F1E77.png"><img style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/4810.image_thumb_18FEB553.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/4810.image_5F00_thumb_5F00_18FEB553.png" alt="image" width="444" height="263" border="0" /></a></p>
<p>&nbsp;</p>
<p>Sin embargo, ese mismo c&oacute;digo, ejecutado sin el modo debug y con las librer&iacute;as compiladas como release, tarda 11 segundos. Estamos hablando de que tarda tres veces menos cambiando un par&aacute;metro en el fichero de configuraci&oacute;n y un par&aacute;metro en el Visual Studio.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/1526.image_30B5ECB9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/1526.image_5F00_30B5ECB9.png"><img style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/8816.image_thumb_6FA76D54.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/8816.image_5F00_thumb_5F00_6FA76D54.png" alt="image" width="443" height="225" border="0" /></a></p>
<p>&nbsp;</p>
<p>No quiero decir que haciendo eso se va a mejorar tres veces m&aacute;s el tiempo de ejecuci&oacute;n, puesto que depender&aacute; de la codificaci&oacute;n de la aplicaci&oacute;n y de otros factores, pero s&iacute; que har&aacute; que el rendimiento sea mucho mejor.</p>
<p>&nbsp;</p>
<p>Espero que os sirva.</p>
<p>- Jos&eacute; Ortega Guti&eacute;rrez</p>]]></content:encoded>
    </item>
    <item>
      <title>IIS 7.x: No se inicia el IIS de una máquina clonada</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/iis-7-x-no-se-inicia-el-iis-de-una-mquina-clonada</link>
      <pubDate>Sun, 19 May 2013 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2013/05/19/iis-7-x-no-se-inicia-el-iis-de-una-mquina-clonada/</guid>
      <description><![CDATA[He tenido varios casos en los que tras clonar un servidor con un IIS, el IIS clonado no funciona...]]></description>
      <content:encoded><![CDATA[<p>He tenido varios casos en los que tras clonar un servidor con un IIS, el IIS clonado no funciona ocasionado por errores en los valores encriptados. Por seguridad, el IIS guarda los valores sensibles (como las claves de las credenciales de los usuarios) encriptados en el fichero de configuración del IIS ApplicationHost.config ya que es un fichero de texto plano que no tiene más protección que ese contenido encriptado.</p>  <p>El problema reside en las claves de encriptación de la máquina, al realizar un sysprep sobre la máquina, estas claves cambian por lo que el IIS no es capaz de desencriptar las claves de las credenciales por lo que no puede auntenticar al usuario por lo que o bien no puede iniciar los Application Pools porque no es capaz de leer la clave o bien no podrá autenticar a un usuario con credenciales fijas&#160; en una aplicación.</p>  <p>Lo primero que debemos saber es que no está soportado el aplicar sysprep en una máquina que tenga un IIS en el que su configuración. Entre otras cosas porque cambia todas las claves de encriptación y por eso no puede funcionar. En este artículo se detalle el soporte de sysprep en una máquina con IIS: <a href="https://technet.microsoft.com/en-us/library/dd744581(WS.10).aspx">https://technet.microsoft.com/en-us/library/dd744581(WS.10).aspx</a>&#160;</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/8004.clip_image0027_5C4A5CFA.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/8004.clip_5F00_image0027_5F00_5C4A5CFA.jpg"><img title="clip_image002[7]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image002[7]" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/88/metablogapi/1184.clip_image0027_thumb_4CC74B2B.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-88-metablogapi/1184.clip_5F00_image0027_5F00_thumb_5F00_4CC74B2B.jpg" width="559" height="90" /></a></p>  <p>La mejor opción es la de clonar la máquina sin esas claves de encriptación, porque esto nos evitaría todos estos conflictos. Otras alternativa puede ser el emplear una configuración compartida o usar MSDeploy para exportar la configuración sin los valores encriptados. </p>  <p>&#160;</p>  <p>Espero que os sirva de ayuda</p>  <p>- José Ortega Gutiérrez</p>]]></content:encoded>
    </item>
    <item>
      <title>IIS 6/7.x: No se refrescan los cambios en una página que se muestra a través de un iFrame</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/iis-67-x-no-se-refrescan-los-cambios-en-una-pgina-que-se-muestra-a-travs-de-un-iframe</link>
      <pubDate>Wed, 15 May 2013 04:34:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2013/05/15/iis-67-x-no-se-refrescan-los-cambios-en-una-pgina-que-se-muestra-a-travs-de-un-iframe/</guid>
      <description><![CDATA[Imaginad que tenemos una p&aacute;gina que se muestra a trav&eacute;s de un iFrame y que...]]></description>
      <content:encoded><![CDATA[<p>Imaginad que tenemos una p&aacute;gina que se muestra a trav&eacute;s de un iFrame y que est&aacute;is realizando cambios sobre esa p&aacute;gina. Lo que querr&iacute;amos es que se actualizase el contenido de la p&aacute;gina cuando le demos a refrescar al navegador.</p>
<p>Ahora vamos a imaginar que no se actualiza, sin embargo, si realizamos los mismos cambios pero vemos la p&aacute;gina directamente, sin usar el iFrame, los cambios aparecen nada m&aacute;s dar a refrescar la p&aacute;gina en el navegador.</p>
<p>Lo que parece que ocurre es que estando dentro del iFrame, el navegador est&aacute;n enviando una fecha de modificaci&oacute;n que no es la m&aacute;s actual, por lo que cuando el IIS recibe el entiende que el navegador tiene la &uacute;ltima versi&oacute;n as&iacute; que env&iacute;a un 304 sin enviar contenido. En este art&iacute;culo tienes m&aacute;s informaci&oacute;n sobre el estado: <a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.HTML">https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.HTML</a></p>
<p>&nbsp;</p>
<p>Una forma de evitarlo es quitar el cacheo en la ruta d&oacute;nde est&eacute; esa p&aacute;gina.</p>
<p><strong>IIS 6</strong></p>
<p>En este art&iacute;culo se indica c&oacute;mo se deshabilita: <a href="https://support.microsoft.com/kb/247404">https://support.microsoft.com/kb/247404</a></p>
<p>CSCRIPT ADSUTIL.VBS SET W3SVC/1/ROOT/<strong>NombreDirectorioVirtual</strong>/CacheControlCustom "no-cache"</p>
<p><strong>IIS 7</strong></p>
<p>En este art&iacute;culo se indica c&oacute;mo se deshabilita: <a title="https://www.iis.net/configreference/system.webserver/caching" href="https://www.iis.net/configreference/system.webserver/caching">https://www.iis.net/configreference/system.webserver/caching</a></p>
<p>&nbsp;</p>
<p>Espero que os sirva de ayuda</p>
<p>- Jos&eacute; Ortega Guti&eacute;rrez</p>]]></content:encoded>
    </item>
    <item>
      <title>FTP 7.x: Error 550 cuando intentamos acceder a un fichero abierto por Office</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/ftp-7-x-error-550-cuando-intentamos-acceder-a-un-fichero-abierto-por-office</link>
      <pubDate>Wed, 10 Apr 2013 04:11:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2013/04/10/ftp-7-x-error-550-cuando-intentamos-acceder-a-un-fichero-abierto-por-office/</guid>
      <description><![CDATA[Hemos tenido varios casos en los que nos consultan el motivo del error 550 The process cannot access...]]></description>
      <content:encoded><![CDATA[<p>Hemos tenido varios casos en los que nos consultan el motivo del error <strong>550 The process cannot access the file because it is being used by another process </strong>cuando intentan acceder a ficheros que est&aacute;n abiertos por una aplicaci&oacute;n del Office.</p>
<p>El problema no est&aacute; realmente en Office, sino en que est&eacute; abierto el fichero en modo exclusivo.</p>
<p>Uno de los cambios de FTP, es que accede a un fichero en modo de acceso de lectura exclusivo, por lo que necesita que el fichero que intenta abrir no est&eacute; siendo utilizado.</p>
<p>Si el fichero est&aacute; siendo bloqueado por Excel, el FTP devolver&aacute; el error que te est&aacute; mostrando. S&iacute; que permite abrir ficheros que est&eacute;n siendo usados por aplicaciones que no bloquean el fichero. Nos hab&eacute;is comentado que hab&eacute;is probado a abrir ese mismo fichero con el bloc de notas y no hab&eacute;is tenido errores.</p>
<p>Dado que el comportamiento que est&aacute; teniendo el IIS es por dise&ntilde;o, no podemos modificarlo, pero s&iacute; podemos daros algunas alternativas, como el uso de WebDAV o el directory Browsing.</p>
<p><strong>WebDAV</strong></p>
<p>Esta opci&oacute;n te permitir&aacute; acceder a los recursos usando el explorador de Windows pero internamente usando HTTP, permitiendo que puedas mapear unidades de red a una URL del IIS. As&iacute; pues podr&aacute;s asignar una localizaci&oacute;n remota en un directorio virtual y acceder a trav&eacute;s del explorador de Windows usando la URL de ses directorio virtual.</p>
<p>Para instalar y configurar WebDAV te dejo este art&iacute;culo: <a href="https://www.iis.net/learn/install/installing-publishing-technologies/installing-and-configuring-webdav-on-iis">https://www.iis.net/learn/install/installing-publishing-technologies/installing-and-configuring-webdav-on-iis</a></p>
<p>As&iacute; como estos art&iacute;culos que comentan c&oacute;mo solventar algunos problemas que puedan surgir: <a href="https://blogs.msdn.com/b/desarrolloweb/archive/tags/webdav/">https://blogs.msdn.com/b/desarrolloweb/archive/tags/webdav/</a></p>
<p><strong>Directory Browsing</strong></p>
<p>Esta opci&oacute;n permite que desde el navegador puedas listar el contenido del directorio Virtual.</p>
<p>En este art&iacute;culo te dejo las instrucciones para configurarlo: <a href="https://www.iis.net/configreference/system.webserver/directorybrowse">https://www.iis.net/configreference/system.webserver/directorybrowse</a><strong> </strong></p>
<p>&nbsp;</p>
<p>Espero que os sirva de ayuda</p>
<p>- Jose Ortega Guti&eacute;rrez</p>]]></content:encoded>
    </item>
    <item>
      <title>No se cambia el valor del timeout en tiempo de ejecución cuando cambio el valor incovando a la API de WinINET cuando accedo a través de un proxy y protocolo seguro</title>
      <link>https://docs.microsoft.com/archive/blogs/desarrolloweb/no-se-cambia-el-valor-del-timeout-en-tiempo-de-ejecucin-cuando-cambio-el-valor-incovando-a-la-api-de-wininet-cuando-accedo-a-travs-de-un-proxy-y-protocolo-seguro</link>
      <pubDate>Mon, 18 Mar 2013 13:15:00 GMT</pubDate>
      <dc:creator><![CDATA[José Ortega Gutiérrez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/desarrolloweb/2013/03/18/no-se-cambia-el-valor-del-timeout-en-tiempo-de-ejecucin-cuando-cambio-el-valor-incovando-a-la-api-de-wininet-cuando-accedo-a-travs-de-un-proxy-y-protocolo-seguro/</guid>
      <description><![CDATA[Es un t&iacute;tulo largo, pero no creo que se pueda resumir de mejor forma. Imaginad que...]]></description>
      <content:encoded><![CDATA[<p>Es un t&iacute;tulo largo, pero no creo que se pueda resumir de mejor forma. Imaginad que ten&eacute;is un c&oacute;digo para cambiar el valor del timeout de la operaci&oacute;n cuando us&aacute;is el API de WinINET. Este cambio funciona perfectamente menos cuando la petici&oacute;n se hace a trav&eacute;s de un proxy utilizando un canal seguro SSL.</p>
<p>&iquest;Por qu&eacute; funciona cuando va a trav&eacute;s de un proxy o a trav&eacute;s de SSL pero no cuando juntamos los dos?</p>
<p>La respuesta es que cuando se realiza una petici&oacute;n HTTPS a un proxy se usan dos manejadores, uno para la petici&oacute;n exterior y otro para manejar el CONNECT del t&uacute;nel del proxy. Por lo que se marca el flag INTERNET_NO_CALLBACK para evitar que el que invoca pueda recibir notificaciones duplicadas.</p>
<p>&iquest;Eso implica que no podemos hacer nada para cambiarlo?. La verdad es que tenemos dos opciones, una de ellas es cambiar un par&aacute;metro del registro de Windows (<span style="font-family: Consolas; font-size: xx-small;">HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings</span>) siguiendo las instrucciones que se detallan en este art&iacute;culo: <a title="https://support.microsoft.com/kb/181050/es" href="https://support.microsoft.com/kb/181050/es">https://support.microsoft.com/kb/181050/es</a></p>
<p>Otra opci&oacute;n es la de crear un subproceso para que realice ese cambio usando la funci&oacute;n InternetCloseHandle <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa384350(v=vs.85).aspx">https://msdn.microsoft.com/en-us/library/windows/desktop/aa384350(v=vs.85).aspx</a> . En este art&iacute;culo se detalla c&oacute;mo realizar ese cambio: <a href="https://support.microsoft.com/kb/224318">https://support.microsoft.com/kb/224318</a></p>
<p>&nbsp;</p>
<p>Espero que os sirva de ayuda</p>
<p>- Jos&eacute; Ortega Guti&eacute;rrez</p>]]></content:encoded>
    </item>
  </channel>
</rss>