<?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>Web Dev &amp; Infra: qual o seu lado?</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/teixeira/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/teixeira/feed.xml</link>
    <description>Paulo Teixeira escreve sobre Web/IIS para ajudar a desenvolvedores escreverem aplicações mais eficientes e performáticas. Também fala sobre técnicas para identificação e resolução de problemas em aplicações e otimização de infra-estrutura Web.</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:33:29 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Alterando o disco de SO em uma VM do Azure Resource Manager</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/alterando-o-disco-de-so-em-uma-vm-do-azure-resource-manager</link>
      <pubDate>Thu, 17 Dec 2015 12:01:33 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2015/12/17/alterando-o-disco-de-so-em-uma-vm-do-azure-resource-manager/</guid>
      <description><![CDATA[&#160;  No Azure é possível alterar o tamanho de um disco de uma máquina virtual utilizando comandos...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>No Azure é possível alterar o tamanho de um disco de uma máquina virtual utilizando comandos powershell. </p>  <p>Para o modo do Azure Service Manager (ASM) existe um cmdlet powershell chamado <em>Update-AzureDisk</em> com vasta documentação na internet. Agora, para o Azure Resource Manager (ARM) não existe o comando equivalente. Após estudar o problema um pouco, é possível notar que esta é uma das diversas diferenças entre os dois modos (ARM e ASM). </p>  <p>No ARM, as propriedades do disco (inclusive o tamanho) estão associadas ao perfil de armazenamento da máquina virtual (i.e. “VM Storage Profile”). Também é possível atualizar algumas destas propriedades através do powershell. No caso dos discos da máquina virtual, é possível aumentar o tamanho alterando a propriedade DiskSizeInGb do objeto OSDisk (para discos de sistema) ou de cada um dos objetos DataDisks associados à máquina virtual.</p>  <p>Recentemente precisei realizar esta tarefa para o disco de sistema operacional de algumas máquinas e montei um script powershell para fazer esta tarefa. Segue abaixo um exemplo de como utilizar estes comandos powershell: </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/3060.image_7C3F3664.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/3060.image_5F00_7C3F3664.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" 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/40/37/metablogapi/3857.image_thumb_78C0A57A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/3857.image_5F00_thumb_5F00_78C0A57A.png" width="857" height="404" /></a>&#160; <br /><em><strong>Nota: a Microsoft não oferece suporte a este script; use por sua conta e risco. </strong></em></p>  <p>Observe que o script irá parar a máquina virtual, realizar a alteração de tamanho do disco e reiniciá-la. Este é um requisito pois não é possível alterar a configuração de hardware (Storage Profile) com a máquina em execução. </p>  <p>[]s</p>  <p>PT</p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Key Vault? Posso confiar e colocar minhas chaves nesse serviço?</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/azure-key-vault-posso-confiar-e-colocar-minhas-chaves-nesse-servio</link>
      <pubDate>Thu, 19 Nov 2015 15:41:29 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2015/11/19/azure-key-vault-posso-confiar-e-colocar-minhas-chaves-nesse-servio/</guid>
      <description><![CDATA[Recentemente um cliente me perguntou sobre o serviço Azure Key Vault. A dúvida era a seguinte:...]]></description>
      <content:encoded><![CDATA[<p>Recentemente um cliente me perguntou sobre o serviço Azure Key Vault. A dúvida era a seguinte: </p>  <p>“<em>Uma vez que eu armazenei minhas chaves de criptografia no Azure Key Vault, a Microsoft pode ter acesso as mesmas?</em>”</p>  <p>Talvez nem todo mundo tenha clareza que todas as chaves armazenadas em um Vault tem um objetivo único que é ser acessada por algum sistema ou aplicação. Então, por “a Microsoft pode ter acesso a chave” eu imagino que os clientes estejam querendo dizer “<i>Uma pessoa ou recurso não autorizado poderia exportar/copiar essa chave para um outro ambiente, e juntamente com uma cópia dos dados dos discos dos clientes, decriptografar o conteúdo e acessá-lo</i>”.&#160; </p>  <p>Assumindo que seja isso, começo explicando que para adicionar uma chave ao Key Vault o cliente (e só ele) deve criar um ‘secret’ (uma senha), como exemplificado:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/4606.clip_image002_1C32F917.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/4606.clip_5F00_image002_5F00_1C32F917.gif"><img title="clip_image002" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/6114.clip_image002_thumb_6728FA97.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/6114.clip_5F00_image002_5F00_thumb_5F00_6728FA97.gif" width="679" height="26" /></a>    <br /><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/1641.clip_image004_5B270A63.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/1641.clip_5F00_image004_5F00_5B270A63.gif" name="_MailEndCompose"><img title="clip_image004" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/3343.clip_image004_thumb_23E08328.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/3343.clip_5F00_image004_5F00_thumb_5F00_23E08328.gif" width="682" height="38" /></a></p>  <p>Só o cliente tem acesso a esse senha, e somente é possível exportar as chaves usando esta senha. Esse é um primeiro nível de segurança, mas adicionalmente o cliente pode escolher entre armazenar esta chave no Azure Key Vault usando um armazenamento ‘em Software’ ou ‘em Hardware&#160; HSM’.</p>  <p>Embora pouco provável, em teoria ao armazenar a chave em Software seria possível invadir um Datacenter do Azure burlando todas as medidas de segurança, alarmes, controle de acesso físico, etc e identificar num pool de milhares de servidores quais rodam o serviço do Azure Key Vault, colocá-lo debaixo do braço e levá-lo embora. </p>  <p>Depois, inicializar os servidores usando algum outro sistema (ex: Linux) e via software e tentar quebrar bitlocker, criptografia, etc para conseguir extrair/exportar as chaves dos clientes. E usando métodos de força bruta, após alguns anos, se conseguiria descobrir a senha que o cliente usou para finalmente ter acesso a chave. </p>  <p>Mesmo assim, imaginando que existam clientes que precisem de um nível de segurança acima do que já expliquei, também é possível armazenar as chaves dos clientes em hardware (via Thales HSM, na SKU Premium); estas chaves uma vez armazenadas nesses HSMs *<b>não podem mais ser exportadas</b>* (nem pelo próprio cliente, já que isso está garantido no hardware HSM). </p>  <p>Finalmente, o cliente pode ter o próprio HSM e usá-lo para gerar suas próprias chaves on-premises. Então, usando um pacote BYOK (bring your own key), armazenar as chaves nos HSMs do Azure Key Vault. Com este cenário, as chaves são virtualmente inviolávies (a não ser que se descubra algum método de hackear os HSMs e se consiga ter acesso físico aos mesmos). Este cenário está detalhado aqui: <a href="https://azure.microsoft.com/en-us/documentation/articles/key-vault-hsm-protected-keys/">https://azure.microsoft.com/en-us/documentation/articles/key-vault-hsm-protected-keys/</a></p>  <p>Assim (e finalmente), respondendo efetivamente a pergunta: </p>  <p>“<i>Só o cliente tem a chave ou a Microsoft tem condições de ter acesso a essa chave ?</i>”</p>  <p>R: Não. A Microsoft não tem como ter acesso as chaves. Todavia, as chaves estão <b>armazenadas</b> no serviço Key Vault e portanto podem (e devem) ser acessadas por aplicações na plataforma Azure (ou fora dela) de acordo com as regras que o cliente estabelece (através de <a href="https://msdn.microsoft.com/en-us/library/mt603625.aspx">policies</a> por ele definidas). </p>  <p>A Microsoft não possui mecanismos para exportar estas chaves do Azure Key Vault e reutilizá-las em outros ambientes para ter acesso à dados de clientes; somente o cliente conseguirá exportar as suas chaves (<font color="#ff0000">e se ele perder as senhas, então nem ele, nem a Microsoft conseguirão exportá-las</font>). O cliente pode optar por armazenar suas chaves em HSMs do Azure Key Vault que acrescentam uma camada extra de proteção e não permitem que as chaves sejam exportadas;</p>  <p>Por último, além de todo o tequiniquês sobre HSMs, criptografia, chaves, etc, o cliente também tem a <a href="https://azure.microsoft.com/pt-br/support/trust-center/compliance/fips-140-2/">Garantia Legal</a> pela certificação FIPS 140-2, dentre outras. </p>  <p>Para mais informações, vejam <a href="https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fazure.microsoft.com%2fen-us%2fdocumentation%2fservices%2fkey-vault%2f&amp;data=01%7c01%7cPaulo.Teixeira%40microsoft.com%7ce327767d06294ab9f3b008d2f123e386%7c72f988bf86f141af91ab2d7cd011db47%7c1&amp;sdata=Jl9uI%2fJgHgb6CHItgkbUInIWK3wPcYjKJvbCiGg5sig%3d">https://azure.microsoft.com/en-us/documentation/services/key-vault/</a>&#160; e <a href="https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fazure.microsoft.com%2fen-us%2fdocumentation%2farticles%2fkey-vault-get-started%2f&amp;data=01%7c01%7cPaulo.Teixeira%40microsoft.com%7ce327767d06294ab9f3b008d2f123e386%7c72f988bf86f141af91ab2d7cd011db47%7c1&amp;sdata=XT4AvtcHFJDtJwxljNXMpgJU1xxmZr6Jv3cLSjbTpfk%3d">https://azure.microsoft.com/en-us/documentation/articles/key-vault-get-started/</a></p>  <p>Abraços,</p>  <p>PT</p>]]></content:encoded>
    </item>
    <item>
      <title>Back to the business!!!!</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/back-to-the-business</link>
      <pubDate>Tue, 20 Oct 2015 15:13:06 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2015/10/20/back-to-the-business/</guid>
      <description><![CDATA[&#160;  Depois de um longo inverno, estou de volta aos posts aqui no Blog.   E com uma boa novidade,...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>Depois de um longo inverno, estou de volta aos posts aqui no Blog. </p>  <p>E com uma boa novidade, agora sou 100% Cloud, então vão aparecer vários posts sobre Azure.</p>  <p>[]s   <br />PT</p>]]></content:encoded>
    </item>
    <item>
      <title>Por onde anda o "PT" ?</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/por-onde-anda-o-pt</link>
      <pubDate>Tue, 03 Feb 2015 10:35:00 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2015/02/03/por-onde-anda-o-pt/</guid>
      <description><![CDATA[Antes que perguntem, aqui na Microsoft quase todos me chamam de "PT" (i.e. Paulo Teixeira)J&aacute;...]]></description>
      <content:encoded><![CDATA[<p>Antes que perguntem, aqui na Microsoft quase todos me chamam de "PT" (i.e. Paulo Teixeira)<br />J&aacute; faz um bom tempo que n&atilde;o tenho feito nenhum post, ent&atilde;o quem acompanha(va) o blog deve estar querendo saber o que houve.</p>
<p>O que aconteceu &eacute; que mudei de fun&ccedil;&atilde;o e n&atilde;o estou mais trabalhando com suporte &agrave; aplica&ccedil;&otilde;es Web (ao menos n&atilde;o <em>oficialmente</em>). Por outro lado, isso n&atilde;o &eacute; ruim pois agora o foco principal &eacute; em Cloud Computing (aka Microsoft Azure).</p>
<p>Resumindo, continuo trabalhando com cen&aacute;rios em que envolvem Infra e Dev e que at&eacute; ganhou um nome "bonito": DevOps. E, como tem muita novidade e quest&otilde;es interessantes sobre Azure, em breve vou publicar alguns posts sobre o assunto. <em>Stay tuned!</em></p>
<p>Um abra&ccedil;o,</p>
<p>PT</p>]]></content:encoded>
    </item>
    <item>
      <title>Verificando assemblies em modo debug, v2.0 by Rafael &amp; Henrique</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/verificando-assemblies-em-modo-debug-v2-0-by-rafael-henrique</link>
      <pubDate>Wed, 22 May 2013 13:48:45 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2013/05/22/verificando-assemblies-em-modo-debug-v2-0-by-rafael-henrique/</guid>
      <description><![CDATA[Conversando com dois colegas, o Rafael Marrara e o Henrique da Silva (ambos PFEs de IIS aqui comigo...]]></description>
      <content:encoded><![CDATA[<p>Conversando com dois colegas, o Rafael Marrara e o Henrique da Silva (ambos PFEs de IIS aqui comigo na Microsoft), eles comentaram que fizeram um script muito similar ao que eu havia publicado a algum tempo atrás para identificar aplicações em modo debug. </p>  <p>O interessante é que eles criaram esse script para resolver um pequeno “side effect” da versão inicial que eu havia escrito: o meu script carregava a DLL via powershell, e por consequência ela ficava bloqueada (durante o tempo de execução do script) não podendo sofrer nenhuma alteração. </p>  <p>Com isso, se a aplicação fosse recompilada naquele período de tempo, isso poderia gerar um erro. Além disso, a forma de verificar se os assemplies estão compilados em modo debug foi aperfeiçoada e dados adicionais são exibidos. O resultado final ficou muito bom e por isso eu pedi a autorização deles para publicar o script aqui no blog. </p>  <p>Segue: </p>  <p>&#160;</p>  <p><font face="Courier New">##</font></p> <font face="Courier New"></font>  <p><font face="Courier New">if ($args[0] -eq $null) {     <br />&#160;&#160;&#160; $path = $(Split-Path $MyInvocation.InvocationName)      <br /> } else {      <br />&#160;&#160;&#160; if (Test-Path($args[0])) {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $path = $args[0]      <br />&#160;&#160;&#160; } else {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; write-host &quot;O diretório&quot; $args[0] &quot;não existe!&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Break      <br />&#160;&#160;&#160; }      <br /> }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">##</font></p> <font face="Courier New"></font>  <p>   <br /><font face="Courier New">function Get-DotNetDebuggableAttribute     <br /> {      <br />&#160;&#160;&#160; [CmdletBinding()]      <br />&#160;&#160;&#160; Param(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [Parameter(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Mandatory=$True,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ValueFromPipeline=$True      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; )] [string[]]$files      <br />&#160;&#160;&#160; )</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160; Begin     <br />&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $list = @()      <br />&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160; Process     <br />&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach ( $filename in $files )      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( Test-Path $filename )      <br />&#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; $file = Get-Item $filename      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( $file.Extension -eq '.dll' )      <br />&#160;&#160;&#160;&#160;&#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;&#160;&#160;&#160;&#160; try      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $assembly = [System.Reflection.Assembly]::Load([System.IO.File]::ReadAllBytes($file.FullName))      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $file | Add-Member NoteProperty ImageRuntimeVersion $assembly.ImageRuntimeVersion      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $modules = $assembly.GetModules($false)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($modules.Length -gt 0) {      <br />&#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; $portableExecutableKinds = New-Object System.Reflection.portableExecutableKinds      <br />&#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; $imageFileMachine = New-Object System.Reflection.imageFileMachine      <br />&#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; $modules[0].GetPEKind([ref]$portableExecutableKinds, [ref]$imageFileMachine)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#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; $file | Add-Member NoteProperty PortableExecutableKinds $portableExecutableKinds     <br />&#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; $file | Add-Member NoteProperty ImageFileMachine $imageFileMachine</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#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; Switch($portableExecutableKinds.ToString().Split(',').Trim()){     <br />&#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; &quot;Required32Bit&quot; {$platformTarget = &quot;x86&quot;}      <br />&#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; &quot;PE32Plus&quot; {$platformTarget = &quot;x64&quot;}      <br />&#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; &quot;ILOnly&quot; {$platformTarget = &quot;Any CPU&quot;}      <br />&#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; default {$platformTarget = &quot;Unknown&quot;}      <br />&#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; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#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; $file | Add-Member NoteProperty PlatformTarget $platformTarget</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {     <br />&#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; $file | Add-Member NoteProperty PortableExecutableKinds $null      <br />&#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; $file | Add-Member NoteProperty ImageFileMachine $null      <br />&#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; $file | Add-Member NoteProperty PlatformTarget $null      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $attrs = $assembly.GetCustomAttributes([System.Type]::GetType(&quot;System.Diagnostics.DebuggableAttribute&quot;), 0)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($attrs.Count -eq 1) {       <br />&#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; $attr = $attrs[0]      <br />&#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; $file | Add-Member NoteProperty IsJITTrackingEnabled $attr.IsJITTrackingEnabled      <br />&#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; $file | Add-Member NoteProperty IsJITOptimizerDisabled $attr.IsJITOptimizerDisabled      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {      <br />&#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; $file | Add-Member NoteProperty IsJITTrackingEnabled $null      <br />&#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; $file | Add-Member NoteProperty IsJITOptimizerDisabled $null      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $list += $file      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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;&#160;&#160;&#160;&#160; catch      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Write-Debug &quot;Error trying to access the file using System.Reflection.Assembly&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Write-Debug &quot;Error: $_&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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; }      <br />&#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; <br />&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160; End     <br />&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( $list.Count -gt 0 )      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; #Write-Output $list | Format-Table Mode, LastWriteTime, Length, Name, IsJITOptimizerDisabled, IsJITTrackingEnabled -AutoSize      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return $list      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }      <br />&#160;&#160;&#160; }      <br /> }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">get-childitem $path -Recurse -include *.dll | Get-DotNetDebuggableAttribute | Format-Table LastWriteTime, Name, ImageRuntimeVersion, PlatformTarget, IsJITOptimizerDisabled -AutoSize</font>    <br /></p>  <p>Lembrando que este script não é suportado de forma alguma pela Microsoft, use por sua conta e risco. </p>  <p>PS: ele não faz nenhuma alteração no seu ambiente, e portanto, não deveria causar problemas. De qualquer forma, eu recomendo utilizado em ambientes de teste, homologação ou pré-produção.</p>  <p>&#160;</p>  <p>abraços,</p>  <p>Paulo.&#160; </p>]]></content:encoded>
    </item>
    <item>
      <title>Como resolver o erro “Request is not available in this context”</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/como-resolver-o-erro-request-is-not-available-in-this-context</link>
      <pubDate>Wed, 20 Feb 2013 09:42:00 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2013/02/20/como-resolver-o-erro-request-is-not-available-in-this-context/</guid>
      <description><![CDATA[&nbsp;
Voc&ecirc; est&aacute; trabalhando para migrar uma aplica&ccedil;&atilde;o .NET do...]]></description>
      <content:encoded><![CDATA[<table style="width: 560px;" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="560">
<h4><em></em>&nbsp;</h4>
<p>Voc&ecirc; est&aacute; trabalhando para migrar uma aplica&ccedil;&atilde;o .NET do IIS6 para o IIS 7.x/8 e ap&oacute;s fazer toda a configura&ccedil;&atilde;o imediatamente no primeiro acesso j&aacute; recebe a seguinte mensagem de erro:</p>
<blockquote>
<h4><em>Request is not available in this context</em></h4>
<p><strong>Description: </strong>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.</p>
<p><strong>Exception Details: </strong>System.Web.HttpException: Request is not available in this context</p>
</blockquote>
<p>&nbsp;</p>
<p>Logo abaixo voc&ecirc; poder&aacute; encontrar detalhes adicionais (linha onde ocorreu o erro) al&eacute;m de uma pilha similar ao seguinte:</p>
<blockquote>
<p>[HttpException (0x80004005): Request is not available in this context]&nbsp;&nbsp;&nbsp; <br />System.Web.HttpContext.get_Request() +3467061&nbsp;&nbsp;&nbsp; <span style="background-color: #ffff00;">ASP.global_asax.Application_Start</span>(Object source, <br />EventArgs e) in c:\inetpub\wwwroot\global.asax:5</p>
<p>[HttpException (0x80004005): Request is not available in this context]&nbsp;&nbsp;&nbsp; <br />System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(&hellip;</p>
</blockquote>
<p><span style="font-family: Segoe UI;">Como podemos observar, o erro foi gerado no m&oacute;dulo/m&eacute;todo ASP.global_asax.Application_Start da aplica&ccedil;&atilde;o. Este &eacute; um problema conhecido quando se faz a migra&ccedil;&atilde;o de aplica&ccedil;&otilde;es ASP.NET do IIS6 para vers&otilde;es superiores, e est&aacute; descrito no seguinte blog: <a title="https://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart" href="https://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart">https://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart</a></span></p>
<p>Para resolver o problema voc&ecirc; precisar&aacute; solicitar ao desenvolvedor que abra o arquivo GLOBAL.ASAX.CS (ou .VB) da aplica&ccedil;&atilde;o e localize, dentro do m&eacute;todo ApplicationStart() qualquer uso do objeto HttpContext.Current.Request. Em geral voc&ecirc; encontrar&aacute; algo como:</p>
<p>str = HttpContext.Current.Request.QueryString["key"];</p>
<p>Ser&aacute; necess&aacute;rio remover este c&oacute;digo substituindo-o por algum outro mecanismo. A explica&ccedil;&atilde;o para este erro &eacute; bem simples: no IIS7 o novo pipeline integrado ir&aacute; executar o m&eacute;todo Application_Start() antes que qualquer request chegue ao servidor, e portanto, o objeto Request n&atilde;o est&aacute; dispon&iacute;vel.</p>
<p>Um abra&ccedil;o e at&eacute; a pr&oacute;xima,</p>
<p>PT</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Tracing de aplicações ASP.NET no IIS 7.x/8</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/tracing-de-aplicaes-asp-net-no-iis-7-x8</link>
      <pubDate>Mon, 18 Feb 2013 03:25:00 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2013/02/18/tracing-de-aplicaes-asp-net-no-iis-7-x8/</guid>
      <description><![CDATA[Olá pessoal!          Poucos desenvolvedores fazem uso de um dos recursos mais...]]></description>
      <content:encoded><![CDATA[<table style="width: 560px;" cellspacing="0" cellpadding="0" border="0"><tbody>     <tr>       <td>         <p>Olá pessoal!</p>          <p>Poucos desenvolvedores fazem uso de um dos recursos mais interessantes disponíveis para aplicações ASP.NET, a capacidade de criar <em>traces </em>diretamente a partir do seu código e usá-los para resolver problemas durante a etapa de desenvolvimento.</p>          <p>O uso de &quot;técnicas para criação de traces&quot; é algo muito comum: lembra-se de ter escrito um bom e velho &quot;Response.Write&quot; em aplicações ASP Clássico para validar se os dados em uma determinada rotina está conforme o esperado? Pois é... era assim no ASP Clássico, em C, C++, etc</p>          <p>Nas aplicações ASP.NET este processo é realmente muito simples: basta habilitar o registro de entradas de trace no arquivo web.config, adicionando a seguinte tag:</p>          <p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&lt;trace enabled=&quot;true&quot; localOnly=&quot;false&quot; pageOutput=&quot;false&quot; /&gt;</span></p>          <p>Maiores detalhes sobre a diretiva &lt;trace&gt; do arquivo web.config pode ser obtida em: <a href="https://msdn.microsoft.com/en-us/library/6915t83k(v=vs.80).aspx">https://msdn.microsoft.com/en-us/library/6915t83k(v=vs.80).aspx</a></p>          <p>Com a diretiva trace configurada no seu arquivo web.config agora basta adicionar as diretivas de trace em sua aplicação. O desenvolvedor deverá adicionar algumas linhas de código na sua aplicação, para <em>imprimir </em>os valores que precisam ser validados. Para isso, em cada modulo que se deseja utilizer o trace, deve-se adicionar o namespace System.Web. Um exemplo simples do uso de trace em uma página ASP.NET (em C# e .NET Framework 4.5) é mostrado a seguir:</p>          <p><span style="font-family: courier new,courier; font-size: small;">using System;</span>            <br /><span style="font-family: courier new,courier; font-size: small;">using System.Collections.Generic;</span>            <br /><span style="font-family: courier new,courier; font-size: small;">using System.Web;</span>            <br /><span style="font-family: courier new,courier; font-size: small;">using System.Web.UI;</span>            <br /><span style="font-family: courier new,courier; font-size: small;">using System.Web.UI.WebControls;</span></p>          <p><font face="Courier New"></font></p>          <p><span style="font-family: courier new,courier; font-size: small;">namespace TraceSample</span>            <br /><span style="font-family: courier new,courier; font-size: small;">{</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160; public partial class LongRunningPage : System.Web.UI.Page</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160; {</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160; protected void Page_Load(object sender, EventArgs e)</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160; {</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; //</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; // This is just a page where any GET requests will take... </span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; // well, very long</span></p>          <p><font face="Courier New"></font></p>          <p><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">Trace.Warn(&quot;Warning! Entering in the PAGE_LOAD event&quot;);</font></span></p>          <p><font face="Courier New"></font></p>          <p><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; DateTime start = DateTime.Now;</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; int delay = new Random().Next(5000, 15000);</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; Thread.Sleep(delay);</span></p>          <p><font face="Courier New"></font></p>          <p><span style="font-family: courier new,courier; font-size: small;"> DateTime end = DateTime.Now;</span>            <br /><span style="font-family: courier new,courier; font-size: small;"> myLabel.Text = String.Format(&quot;Total page exec took:{0} ms&quot;, (end - start).TotalMilliseconds);</span></p>          <p><font face="Courier New"></font></p>          <p><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">Trace.Write(&quot;PAGE_LOAD event finished&quot;);</font></span></p>          <p><font face="Courier New"></font></p>          <p><span style="font-family: courier new,courier; font-size: small;">&#160;&#160;&#160; }</span>            <br /><span style="font-family: courier new,courier; font-size: small;">&#160; }</span>            <br /><span style="font-family: courier new,courier; font-size: small;">}</span></p>          <p>No código acima você encontra duas diretivas: Trace.Warn e Trace.Write ... existem poucas diferenças entre elas, a mais visível é que a primeira irá produzir uma entrada em vermelho na saída do trace. </p>          <p>Uma vez que o código da aplicação tenha sido ajustado para criar a saída necessária, você poderá acessar a página e testar a sua aplicação. Após ter executado a página, você poderá visualizar o resultado do trace através do handler TRACE.AXD. Por exemplo, se a página chama-se LongRunning.aspx., você deve primeiro chamar: </p>          <p><a href="https://meusite/LongRunning.aspx">https://meusite/LongRunning.aspx</a> </p>          <p>e depois:</p>          <p><a href="https://meusite/trace.axd">https://meusite/trace.axd</a> </p>          <p>Com isso, uma página de trace similar ao seguinte sera exibida: </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/40/37/metablogapi/1856.image_10B42851.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/1856.image_5F00_10B42851.png"><img title="image" style="border: 0px currentcolor; 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/40/37/metablogapi/5756.image_thumb_6EE84FBF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/5756.image_5F00_thumb_5F00_6EE84FBF.png" width="512" height="143" /></a></p>          <p>Ao se clicar em uma das entradas você poderá observer detalhes do trace daquela página, algo similar ao seguinte:</p>          <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/0451.image_5AEEBD29.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/0451.image_5F00_5AEEBD29.png"><img title="image" style="border: 0px currentcolor; 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/40/37/metablogapi/3666.image_thumb_7F9FD4A0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/3666.image_5F00_thumb_5F00_7F9FD4A0.png" width="509" height="363" /></a></p>          <p>Acima podemos ver o resultado das diretivas de trace que foram adicionadas no código da aplicação. Voilá! </p>          <p>Agora, o mais um ponto: É possível visualizar o resultado das diretivas Trace.Warn nos logs FREB (ou Failed Request Tracing) do IIS. Basta configurar o seu servidor para gerar este tipo de log (conforme as regras que você estabelecer) e ao visualizá-lo você encontrará as saídas geradas pelo seu aplicativo.&#160; Esta é a outra diferença entre as duas diretivas: Trace.Write não irá aparecer nos logs do IIS, e portanto, se precisar usar este recurso de uma forma regular, use somente o Trace.Warn.</p>          <p>E finalmente, aquela dica de sempre: não deixe as diretivas de trace habilitadas em servidores de produção! Sempre podem existir questões relacionadas à segurança de sua aplicação e não custa descuidar! </p>          <p>É isso ai! Não perca tempo e aproveite para usar este recurso durante o processo de desenvolvimento da sua aplicação. </p>          <p>&#160;</p>          <p>Abraços, </p>          <p>PT</p>       </td>     </tr>   </tbody></table>]]></content:encoded>
    </item>
    <item>
      <title>Qual a diferença entre Web Site Project e Web Application Project no Visual Studio?</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/qual-a-diferena-entre-web-site-project-e-web-application-project-no-visual-studio</link>
      <pubDate>Tue, 12 Feb 2013 15:50:00 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2013/02/12/qual-a-diferena-entre-web-site-project-e-web-application-project-no-visual-studio/</guid>
      <description><![CDATA[Faz um tempo um cliente me perguntou a diferença entre Web Site e Web...]]></description>
      <content:encoded><![CDATA[<table style="width: 560px;" cellspacing="0" cellpadding="0" border="0"><tbody>     <tr>       <td>         <p>Faz um tempo um cliente me perguntou a diferença entre Web Site e Web Application.De início eu nem tinha entendido direito a pergunta, mas depois ficou claro a dúvida: a questão estava relacionada aos tipos de projeto disponíveis no Visual Studio.</p>          <p>No Visual Studio, você pode escolher entre dois tipos de projetos Web: <em>Web Site Project (WSP)</em> ou o <em>Web Application Project (WAP)</em>.</p>          <p>A grande diferença entre estes dois tipos de projeto é a forma que ocorre o <em>deployment </em>da aplicação. Em um Web Site Project o Visual Studio irá fazer a publicação de todos os arquivos do projeto (incluíndo o código-fonte da sua aplicação). Já em um Web Application Project somente será publicado o código HTML (markup) e o código <strong>compilado </strong>da sua aplicação. </p>          <p>Em outras palavras, em um Web Application Project o Visual Studio irá se encarregar de compilar a sua aplicação, gerando vários binarios dentro da pasta /BIN. Ao se fazer a publicação somente estes arquivos serão colocados no servidor Web.&#160; </p>          <p>Existem prós e contras para cada um dos tipos de projeto, mas eu pessoalmente sou muito mais a favor do uso de Web Application Projects, por um fator muito simples: você evita que o código-fonte fique visível no servidor Web (ponto para a questão de segurança), e também evita que o servidor Web fique responsável pela compilação da aplicação durante o primeiro acesso (uma outra hora faço&#160; um post com mais detalhes sobre isso).</p>          <p>Uma comparação mais detalhada entre estes dois tipos de projeto pode ser encontrada em&#160; <a href="https://msdn.microsoft.com/en-us/library/aa730880%28VS.80%29.aspx#wapp_topic5">https://msdn.microsoft.com/en-us/library/aa730880(VS.80).aspx#wapp_topic5</a> (em inglês)</p>          <p>[]s           <br />PT </p>       </td>     </tr>   </tbody></table>]]></content:encoded>
    </item>
    <item>
      <title>Como fazer Interop de componentes COM+ 32bits em aplicações .NET 64bits</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/como-fazer-interop-de-componentes-com-32bits-em-aplicaes-net-64bits</link>
      <pubDate>Mon, 11 Feb 2013 02:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2013/02/11/como-fazer-interop-de-componentes-com-32bits-em-aplicaes-net-64bits/</guid>
      <description><![CDATA[Ol&aacute; pessoal! Imagine o seguinte cen&aacute;rio:
Voc&ecirc; possui uma...]]></description>
      <content:encoded><![CDATA[<table style="width: 599px;" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="597">
<p>Ol&aacute; pessoal! Imagine o seguinte cen&aacute;rio:</p>
<p>Voc&ecirc; possui uma aplica&ccedil;&atilde;o antiga constru&iacute;da em ASP.NET mas que por algum motivo espec&iacute;fico ainda usa componentes COM atrav&eacute;s de Interop.</p>
<p>Este, apesar de n&atilde;o desejado, &eacute; um cen&aacute;rio muito comum, em particular em ambientes corporativos: muitas vezes os componentes COM foram constru&iacute;dos em VB6 ou VC++ e encapsulam regras de neg&oacute;cio que n&atilde;o mudaram. Como as &aacute;reas de TI nem sempre possuem or&ccedil;amento para fazer a convers&atilde;o deste c&oacute;digo para uma linguagem .NET como o Visual Basic.NET ou C#, esses componentes costumam ser usados por um logo per&iacute;odo de tempo, at&eacute; que um novo projeto substitua inteiramente a aplica&ccedil;&atilde;o.</p>
<p>Agora, imagine que a &aacute;rea de TI da empresa resolve evoluir a plataforma Web para as vers&otilde;es mais recentes do Windows Server, s&oacute; dispon&iacute;veis em 64-bits. Para este cen&aacute;rio sempre existe a possibilidade de rodar os Application Pools do IIS 7.x (e superior) em modo 32-bits, mas seria desej&aacute;vel que asp aplica&ccedil;&otilde;es ASP.NET pudessem explorar o m&aacute;ximo da nova plataforma, com o poder total da arquitetura 64-bits. Mas ai, surge o problema dos velhos componentes VB6 32-bits. Por padr&atilde;o, n&atilde;o &eacute; poss&iacute;vel carregar uma DLL (Componente COM) 32-bits em um processo (Application Pool) 64-bits. O que fazer???</p>
<p>Uma forma simples de continuar utilizando o c&oacute;digo legado desses componentes COM de 32-bits sem custo extra &eacute; passar a us&aacute;-los no COM+ (Component Services). Basta seguir os seguintes passos:</p>
<p>&nbsp;</p>
<ol>
<li>Primeiro, se voc&ecirc; tiver registrado a DLL do seu componente no seu Windows x64, voc&ecirc; ter&aacute; que desfazer este processo. Execute o comando &ldquo;regsvr32 /u &lt;path_e_nome_da_dll&gt;&rdquo;</li>
<li>V&aacute; no <em>Control Panel / Administrative Tools/ Component Services</em>. Depois, no treeview abra <em>My Computer</em>, e ent&atilde;o <em>COM+ Applications</em>. Clique com o bot&atilde;o direito e selecione &ldquo;<em>New &ndash;&gt; Application</em>&rdquo;</li>
<li>Na tela &ldquo;<em>Welcome to the COM Application Install Wizard</em>&rdquo; clique em &ldquo;<em>Next &gt;</em>&rdquo;.</li>
<li>Selecione o bot&atilde;o &ldquo;<em>Create an Empty Application</em>&rdquo;.</li>
<li>D&ecirc; um nome para a sua aplica&ccedil;&atilde;o (qualquer nome serve, mas &eacute; bom colocar algo que lembre o nome do componente que ser&aacute; executado). Depois entre &ldquo;<em>Library / Server</em>&rdquo;, selecione o tipo &ldquo;<em>Server</em>&rdquo;.</li>
<li>Clique em &ldquo;<em>Next &gt;</em>&rdquo; e depois&nbsp; &ldquo;<em>This User&rdquo;</em>.</li>
<li>Selecione o usu&aacute;rio com o qual o componente ser&aacute; executado. Pode ser um usu&aacute;rio de dom&iacute;nio previamente criado para executar o componente ou um dos usu&aacute;rios de sistema existentes (NOTA: escolha o usu&aacute;rio tentando manter o mais seguro poss&iacute;vel; evite LOCAL SYSTEM pois o mesmo tem direitos de administrador no Sistema Operacional, a menos que isso seja um pr&eacute;-requisito da aplica&ccedil;&atilde;o).</li>
<li>Depois pressione &ldquo;<em>Next &gt;</em>&rdquo; nas telas seguintes (n&atilde;o altere nada), at&eacute; concluir a cria&ccedil;&atilde;o da aplica&ccedil;&atilde;o. <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/40/37/metablogapi/7573.image_18BCCED4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/7573.image_5F00_18BCCED4.png"><img style="float: right; display: inline; 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/40/37/metablogapi/1205.image_thumb_703DECBF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-40-37-metablogapi/1205.image_5F00_thumb_5F00_703DECBF.png" alt="image" width="219" height="299" align="right" border="0" /></a></li>
<li>O pr&oacute;ximo passo &eacute; adicionar o seu componente a esta aplica&ccedil;&atilde;o rec&eacute;m-criada. Voc&ecirc; encontrar&aacute; a aplica&ccedil;&atilde;o em <em>Component Services -&gt; Computers -&gt; My Computer -&gt; COM+ Application </em>. Clique no &iacute;cone &ldquo;+&rdquo; e voc&ecirc; ver&aacute; um item &ldquo;<em>Components</em>&rdquo;. Selecione este item.</li>
<li>Usando o Windows Explorer, arraste a DLL para a janela &agrave; direita na tela em &ldquo;<em>Components</em>&rdquo;. Com isso o componente ser&aacute; registrado automaticamente no Component Services. Aparecer&aacute; um &iacute;cone de forma circular e de cor amarelada que representa o Componente rec&eacute;m-instalado.</li>
<li>Em seguida v&aacute; em <em>Component Services -&gt; Computers -&gt; My Computer -&gt; COM+ Application</em> e selecione sua aplica&ccedil;&atilde;o. Clique com o bot&atilde;o direito e abra as propriedades selecionando &ldquo;<em>Properties</em>&rdquo; no menu de contexto.</li>
<li><span style="background-color: #ffff00;">Clique na guia &ldquo;<em>Security</em>&rdquo; e em &ldquo;<em>Authorization</em>&rdquo; desmarque a op&ccedil;&atilde;o &ldquo;<em>Enforce access checks for this application</em>&rdquo;. </span></li>
<li><span style="background-color: #ffff00;">Em &ldquo;<em>Security Level</em>&rdquo; marque a op&ccedil;&atilde;o &ldquo;<em>Perform access checks only at the process level</em>.&rdquo; </span></li>
<li><span style="background-color: #ffff00;">Tamb&eacute;m garanta que &ldquo;<em>Apply restriction policy</em>&rdquo; est&aacute; desmarcado.</span></li>
<li><span style="background-color: #ffff00;">Configure o &ldquo;<em>Impersonate Level</em>&rdquo; para &ldquo;<em>Anonymous</em>&rdquo;</span></li>
<li>O &uacute;ltimo passo ser&aacute; garantir que o usu&aacute;rio que roda o Application Pool poder&aacute; utilizar o seu componente. Para isso, em COM+ <em>Application &ndash;&gt; &lt;Nome_da_sua_aplicacao&gt; -&gt; Roles -&gt; CreateOwner &ndash;&gt; Users</em> voc&ecirc; dever&aacute; adicionar o usu&aacute;rio do IIS (em geral IUSR) ou o grupo IIS_USRS (para o IIS 7.X/8).</li>
<li>
<div align="left">Tamb&eacute;m garanta que a pasta onde est&aacute; instalado o componente esteja com permiss&otilde;es NTFS que permitam ao usu&aacute;rio do Application Pool possa ler o arquivo do componente. Em geral &eacute; suficiente adicionar a permiss&atilde;o de Execu&ccedil;&atilde;o nesta pasta para o grupo IIS_USRS.</div>
</li>
</ol>
<div align="center">
<table style="width: 560px;" border="0" cellspacing="0" cellpadding="5" bgcolor="#eeeeee">
<tbody>
<tr>
<td valign="top" width="560">
<p align="left"><span style="color: #ff0000;">NOTAS: </span></p>
<p align="left"><span style="color: #ff0000;">a) As configura&ccedil;&otilde;es de seguran&ccedil;a do componente (em amarelo acima) podem variar, se o mesmo necessitar personificar o usu&aacute;rio (i.e. rodar sobre o contexto de um outro usu&aacute;rio, por exemplo, para acessar um banco de dados ou outro recurso externo). <br /></span><span style="color: #ff0000;">b) Se estiver usando o Pipeline Classico do IIS 7.x talvez seja necess&aacute;rio adicionar tamb&eacute;m o usu&aacute;rio IUSR e IWAM quando estiver atribuindo as permiss&otilde;es no Component Services e nas permiss&otilde;es NTFS da pasta.</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p align="center">&nbsp;</p>
<p>Agora basta testar a sua aplica&ccedil;&atilde;o. Configure o Application Pool para rodar em modo 64bits e fa&ccedil;a o teste: a aplica&ccedil;&atilde;o, mesmo usando componentes antigos escritos em VB6 dever&aacute; executar sem problemas.</p>
<p>&nbsp;</p>
<p>At&eacute; a pr&oacute;xima!</p>
<p>PT</p>
</td>
</tr>
</tbody>
</table>]]></content:encoded>
    </item>
    <item>
      <title>Varrendo a poeira!</title>
      <link>https://docs.microsoft.com/archive/blogs/teixeira/varrendo-a-poeira</link>
      <pubDate>Sat, 09 Feb 2013 10:00:01 GMT</pubDate>
      <dc:creator><![CDATA[Paulo Teixeira - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/teixeira/2013/02/09/varrendo-a-poeira/</guid>
      <description><![CDATA[Olá pessoal!           Esse é só um post daqueles que a gente escreve para...]]></description>
      <content:encoded><![CDATA[<table cellspacing="0" cellpadding="2" width="560" border="0"><tbody>     <tr>       <td valign="top" width="560">         <p>Olá pessoal! </p>          <p>Esse é só um post daqueles que a gente escreve para dizer que está fazendo uma faxina na casa. Aproveitando a inspiração de ontem,&#160; acabei fazendo uns updates nos posts antigos sobre ARR (pouca coisa, somente umas referências atualizadas e algumas informações adicionais para deixar o conteúdo mais claro). </p>          <p>Também devo iniciar uma série de posts sobre assuntos diversos, boa parte deles com foco em problemas que ocorrem durante a migração de aplicações de IIS5/6 (32bits) para IIS 7.x/8. </p>          <p>A gente se vê em breve! </p>          <p>&#160;</p>          <p>[]s           <br />PT</p>       </td>     </tr>   </tbody></table>]]></content:encoded>
    </item>
  </channel>
</rss>