Pregunta

IIS 6.0 genera valores eTag en el formato de "picadillo: ChangeNumber". El número de cambios sube cada vez que se reinicia IIS, por lo que su etag sólo es válida para la vida de su proceso de IIS. Reinicio, el número sube, el hash: ChangeNumber = picadillo:. ChangeNumber + 1

La solución para esto es para codificar la ChangeNumber, que es posible usando el explorador de la metabase, una utilidad de .NET para la edición de la metabase, o editando el archivo XML cuando los servicios de IIS se detienen.

Quiero hacer esto mediante programación, con el servidor en funcionamiento, como puedo configurar todas las otras propiedades de la metabase, ya sea con ADSI o WMI. Para éste no parece ser posible, ya que la propiedad (que se refiere sólo a nivel interno como a MD_ETAG_CHANGENUMBER) no parecen tener un nombre de propiedad correspondiente.

Este es un ejemplo del problema en VBScript:

set obj=GetObject("IIS://localhost/W3svc")
WScript.Echo "Log type: " & obj.LogType
WScript.Echo "Change number: " & obj.MD_ETAG_CHANGENUMBER

La salida:

Log type: 1
etag.vbs(3, 1) Microsoft VBScript runtime error: Object doesn't support this property or method: 'obj.MD_ETAG_CHANGENUMBER'

Quiero ser capaz de establecer este valor en C #. Corto de detener IIS, estableciendo el valor en el XML, y comenzar de nuevo, no es un método de establecer este valor mediante programación?

Mi mejor pensamiento es (ab) utilizando el IISMbLib.dll que viene con la metabase Explorer, así que si alguien tiene experiencia en el uso de esto, me encantaría escucharlo.

Referencias:

¿Fue útil?

Solución 2

Mi mejor idea era bastante bueno. Aquí es una solución, la cual depende de IISMbLib.dll desde el Explorador de metabase en el Kit de recursos de IIS 6.0.

        Metabase metabase = new Metabase();
        metabase.OpenLocalMachine();

        IKey key = metabase.GetKeyFromPath("/LM/W3SVC/");
        if (key.ContainsRecord(2039) == IISConfig.ValueExistOptions.Explicit) {
            Record r = key.GetRecord(2039);
            r.Data = Convert.ToUInt32(0);
            key.SetRecord(r);
        } else {
            Record r = new Record();
            r.Data = Convert.ToUInt32(0);
            r.DataType = Record.DataTypes.DWORD;
            r.Identifier = 2039;
            r.ChangeAttribute(Record.AttributeList.Inherit, true);
            key.SetRecord(r);
        }

Otros consejos

CRB, gracias por la gran solución, que fue incapaz de encontrar una alternativa (aunque anteriormente he añadido mis propias propiedades de la metabase de encargo en el esquema de IIS 6 a través de algunas secuencias de comandos complicado ADSI, que son utilizados por un ISAPI personalizada)

Esta es una versión de su solución de PowerShell. Asume el montaje MB Explorador de copiado localmente a él.

$myPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path)

Import-Module "$myPath\IISMbLib.dll"

$etagValue = 12345
$metabase = New-Object IISConfig.Metabase
$metabase.OpenLocalMachine()

$key = $metabase.GetKeyFromPath("/LM/W3SVC")

if ($key.ContainsRecord(2039) -eq [IISConfig.ValueExistOptions]::Explicit)
{
    $record = $key.GetRecord(2039)
    Write-Host "Existing ETag value found:", $record.Data.ToString()
}
else
{
    Write-Host "Creating new value..."
    $record = New-Object IISConfig.Record
    $record.DataType = [IISConfig.Record+DataTypes]::DWORD
    $record.Identifier = 2039
    $record.ChangeAttribute([IISConfig.Record+AttributeList]::Inherit, $true)
}
$record.Data = [System.Convert]::ToUInt32($etagValue)
Write-Host "New ETag value:", $record.Data.ToString()
$key.SetRecord($record)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top