3

IIS 6.0 は、"hash:changenumber" の形式で eTag 値を生成します。変更番号は IIS がリセットされるたびに増加するため、eTag は IIS プロセスの存続期間中のみ有効です。再起動、番号が上がり、hash:changenumber != hash:changenumber+1.

これを修正するには、 changenumber をハードコーディングします。これは、メタベースを編集するための .NET ユーティリティである Metabase Explorer を使用するか、IIS サービスが停止しているときに XML ファイルを編集することで可能です。

ADSI または WMI のいずれかを使用して他のすべてのメタベース プロパティを設定できるように、サーバーを実行してプログラムでこれを行いたいと考えています。これについては、プロパティ (MD_ETAG_CHANGENUMBER として内部的にのみ参照される) が一致するプロパティ名を持っていないように見えるため、可能ではないようです。

VBScript の問題の例を次に示します。

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

出力:

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

この値を C# で設定できるようにしたいと考えています。IIS を停止し、XML で値を設定して、再度開始する以外に、この値をプログラムで設定する方法はありますか?

私の最善の考えは、Metabase Explorer に付属の IISMbLib.dll を (ab) 使用することです。したがって、これを使用した経験のある方がいらっしゃいましたら、ぜひお聞かせください。

参考文献:

4

2 に答える 2

2

crb、優れたソリューションのおかげで、代替案を見つけることができませんでした (ただし、カスタム ISAPI で使用されるトリッキーな ADSI スクリプトを使用して、IIS 6 スキーマに独自のカスタム メタベース プロパティを以前に追加しました)

これは、ソリューションの PowerShell バージョンです。MB Explorer アセンブリがローカルにコピーされていることを前提としています。

$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)
于 2012-04-20T06:13:36.037 に答える
1

私の最高の考えはかなり良かったです。IIS 6.0 Resource Kit の Metabase Explorer の IISMbLib.dll に依存するソリューションを次に示します。

        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);
        }
于 2009-05-28T19:57:38.343 に答える