Domanda

IIS 6.0 genera valori ETAG nel formato di "hash: ChangeNumber". Il ChangeNumber sale ogni volta IIS reset, così il vostro eTag è valida solo per la durata del processo di IIS. Restart, il numero aumenta, hash: ChangeNumber = hash:. ChangeNumber + 1

La correzione di questo è quello di codificare la ChangeNumber, che è possibile utilizzare il metabase Explorer, un programma di utilità di .NET per la modifica del metabase, o modificando il file XML quando i servizi IIS vengono arrestati.

Io voglio fare questo a livello di codice, con il server in esecuzione, come posso impostare tutte le altre proprietà della metabase sia con ADSI o WMI. Per questo non sembra essere possibile, in quanto la proprietà (che si riferisce solo internamente come MD ETAG CHANGENUMBER) non sembra avere un nome di proprietà corrispondente.

Ecco un esempio del problema in VBScript:

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

L'output:

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

Voglio essere in grado di impostare questo valore in C #. A corto di arresto IIS, impostando il valore in XML, e di iniziare di nuovo, c'è un metodo di impostazione di questo valore programatically?

Il mio miglior pensiero è (ab) utilizzando l'IISMbLib.dll che viene fornito con Metabase Explorer, quindi se qualcuno ha esperienza con questo, mi piacerebbe sentirla.

References:

È stato utile?

Soluzione 2

Il mio miglior pensiero era abbastanza buono. Ecco una soluzione, che dipende dal IISMbLib.dll Metabase Explorer nel Resource Kit di 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);
        }

Altri suggerimenti

CRB, grazie per la grande soluzione, sono stato in grado di trovare un'alternativa (anche se ho già aggiunto le mie proprietà della metabase personalizzate allo schema di IIS 6 attraverso alcuni ingannevole script ADSI, che vengono utilizzati da un ISAPI personalizzato)

Ecco una versione di PowerShell della vostra soluzione. Si presuppone MB Explorer assemblaggio copiato localmente ad esso.

$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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top