2016-01-05 7 views
0

Я пытаюсь изменить расположение временных файлов ASP.NET, чтобы я мог очистить их во время выпуска новой версии.Как настроить 32-разрядные веб-сайты IIS или приложения с помощью командлетов PowerShell

Потому что очень трудно найти расположение временных файлов ASP.NET для определенного веб-сайта, приложение виртуального каталога под местоположениями C:\Windows\Microsoft.NET\FrameworkC:\Windows\Microsoft.NET\Framework64. Я решил, что было бы проще просто переместить файлы в определенное место на диск, который затем можно очистить.

Вы можете сделать это, изменив атрибут tempDirectory в разделе конфигурации system.web/compilation.

У нас есть автоматические процессы сборки и выпуска сервера, поэтому это было просто, чтобы добавить код в сценарии конфигурации и выпуска.

Однако во время тестирования я обнаружил, что местоположение 32-разрядных приложений не изменяется.

код я использую:

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT' -location 'MyWebSite' -filter 'system.web/compilation' -name 'tempDirectory' -value 'E:\Temporary ASP.NET Files\MyWebSite' -Clr v2.0 

Этот код работает без ошибок и записывает запись в файл web.config корня на: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config.

например.

<location path="MyWebSite"> 
    <system.web> 
    <compilation tempDirectory="E:\Temporary ASP.NET Files\MyWebSite" /> 
    </system.web> 
</location> 

Обратите внимание, что без параметра -clr v2.0, значение будет записано в файл конфигурации CLR 4.0 на C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config.

Вы можете увидеть запись в редакторе конфигурации IIS, а также: IIS Configuration Editor showing temporary path specified

Проблема заключается в пуле приложений установлено значение «Enable 32-битных приложений» и, следовательно, это свойство игнорируется.

Если я вручную переместить элемент местоположения, показанный выше от C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config к C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config

Изменение работ и действительно временные файлы ASP.NET двигаться в этом месте, указанном при компиляции сайта происходит.

Вопрос не в временных файлах ASP.NET, это более общий вопрос о том, как вы собираетесь настраивать 32-разрядные приложения в PowerShell или действительно в IIS? Кажется, нет никакого способа сделать это, что я считаю невероятным. Существует множество 32-битных приложений, вокруг которых еще нужно настроить.

Также обратите внимание, что я решил использовать корневую web.config, чтобы сохранить это значение по уважительным причинам:

  1. ApplicationHost.config не может хранить system.web конфигурации
  2. Места расположения временных файлов не является чем-то, что известен во время разработки и определяется конфигурацией сервера хостинга. Поэтому этот параметр не может быть указан в файле web.config для самого приложения.

Спасибо за любое просвещение по этому вопросу.

ответ

1

Есть два способа обхода проблемы.

  1. Используйте 32 бит appcmd.exe. Вот пример.

% Windir% \ syswow64 \ cmd.exe % Windir% \ syswow64 \ Inetsrv \ appcmd.exe набор конфигурации -сече-: AppSettings/+ "[ 'тест' ключ =, значение = 'тест']"/commit: webroot /clr:4.0

  1. Используйте MWA непосредственно на PowerShell. Вот пример.

$ Iis = нового объекта Microsoft.Web.Administration.ServerManager $ WCM = New-Object -TypeName Microsoft.Web.Administration.WebConfigurationMap -ArgumentList «C: \ Windows \ Microsoft.NET \ Framework \ v4 .0.30319 \ CONFIG \ machine.config "," C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ CONFIG \ web.config " $ iis.GetWebConfiguration ($ wcm, $ null) .GetSection (" appSettings ") .SetAttributeValue («файл», «test3») $ iis.CommitChanges()

0

После экспериментов, используя некоторую информацию от ответа, представленной здесь и в автономном режиме разговора я могу окончательно сказать, что это не представляется возможным для редактирования 32-битных корневых файлов web.config с помощью командлетов Microsoft WebAdministration PowerShell.

Кажется, что командлеты жестко закодированы, чтобы смотреть только на 64-разрядные версии файлов конфигурации. Диспетчер IIS ведет себя одинаково. Почему это так необъяснимо для меня.

Я также нашел много проблем с помощью некоторых командлетов для редактирования 64-битных веб-сайтов и приложений Clr 2.0. Параметр Clr отсутствует во всех командлетах и ​​даже в тех, где он работает, кажется, не всегда работает.

Поэтому я решил отказаться от командлетов WebAdministration и напрямую использовать сборку «Microsoft.Web.Administration.dll» и объект Microsoft.Web.Administration.ServerManager.

Ниже приведены некоторые из функций, которые я написал, которые могут быть полезны:

function Get-MWAConfigObjects 
    { 
     <# 
       .SYNOPSIS 
       Returns object to manage IIS configuration in root web.config 
       .DESCRIPTION 
       The objects returned allow viewing or editing or configuration. Parameters open the appropriate version, either 32 or 64 bit for the appropriate version of the ManagedRunTime. https://msdn.microsoft.com/en-us/library/microsoft.web.administration.servermanager(v=vs.90).aspx 
Ensure that you call CommitChanges to save any changes made. 
       .EXAMPLE 
       $MWA = Get-MWAConfigObjects -ManagedRunTimeVersion v2.0 -Architecture 32    $MWA.Configuration.GetSection('system.web/compilation','MyWebSite/MyApplication').SetAttributeValue('tempDirectory', 'C:\NewPath') 
       $MWA.ServerManager.CommitChanges()    
     #> 
     [cmdletbinding(positionalbinding = $false)] 
     param(
      [Parameter(Mandatory = $True)][string][ValidateSet('v2.0','v4.0')] $ManagedRunTimeVersion, 
      [Parameter(Mandatory = $True)][string][ValidateSet(32,64)] $Architecture 
     ) 

     $assemblyPath = $(Join-Path -Path $([System.Environment]::GetFolderPath('System')) -ChildPath $(Join-Path -Path 'inetsrv' -ChildPath 'Microsoft.Web.Administration.dll')) 
     If (Test-Path -Path $assemblyPath -PathType Leaf) 
     { 
      $null = [System.Reflection.Assembly]::LoadFrom($assemblyPath) 
      $iis = New-Object -TypeName Microsoft.Web.Administration.ServerManager 
      $wcm = New-Object -TypeName Microsoft.Web.Administration.WebConfigurationMap -ArgumentList $(Get-ConfigFilePath -Type machine -ManagedRunTimeVersion $ManagedRunTimeVersion -Architecture $Architecture), $(Get-ConfigFilePath -Type web -ManagedRunTimeVersion $ManagedRunTimeVersion -Architecture $Architecture) 
      $configuration = $iis.GetWebConfiguration($wcm, $null) 

      $object = New-Object -TypeName PSObject 
      $object | Add-Member -MemberType NoteProperty -Name ServerManager -Value $iis 
      $object | Add-Member -MemberType NoteProperty -Name Configuration -Value $configuration 
      Write-Output -InputObject $object 
     } 
     else 
     { 
      Throw "Cannot validate existence of required assembly 'Microsoft.Web.Administration.dll' at ""$assemblyPath""" 
     } 
    } 

    function Get-ConfigFilePath 
    { 
     [CmdletBinding(PositionalBinding = $false)] 
     param 
     (
      [Parameter(Mandatory = $True)][string][ValidateSet('web','machine')] $Type, 
      [Parameter(Mandatory = $True)][string][ValidateSet('v2.0','v4.0')] $ManagedRunTimeVersion, 
      [Parameter(Mandatory = $True)][string][ValidateSet(32,64)] $Architecture 
     ) 

     $ErrorActionPreference = 'stop' 

     switch ($ManagedRunTimeVersion) 
     { 
      'v2.0' 
      { 
       switch ($Architecture) 
       { 
        32 
        { 
         $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath "Microsoft.NET\Framework\v2.0.50727\CONFIG\$Type.config") 
         break 
        } 
        64 
        { 
         $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath "Microsoft.NET\Framework64\v2.0.50727\CONFIG\$Type.config") 
         break 
        } 
       } 

       break; 
      } 
      'v4.0' 
      { 
       switch ($Architecture) 
       { 
        32 
        { 
         $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath "Microsoft.NET\Framework\v4.0.30319\CONFIG\$Type.config") 
         break 
        } 
        64 
        { 
         $path = $(Join-Path -Path $([System.Environment]::GetFolderPath('Windows')) -ChildPath "Microsoft.NET\Framework64\v4.0.30319\CONFIG\$Type.config") 
         break 
        } 
       } 

       break; 
      } 
     } 

     If (Test-Path -Path $path -PathType Leaf) 
     { 
      Write-Output -InputObject $path 
     } 
     else 
     { 
      Throw "Cannot validate configuration file at path ""$path""" 
     } 
    } 

Я надеюсь, что это поможет кому-то.

 Смежные вопросы

  • Нет связанных вопросов^_^