문제

IIS 6.0은 "HASH : Changenumber"형식으로 ETAG 값을 생성합니다. IIS가 재설정 될 때마다 Changenumber가 증가하므로 ETAG는 IIS 프로세스의 수명에만 유효합니다. 다시 시작, 숫자가 올라가고, 해시 : Changenumber! = Hash : Changenumber+1.

이에 대한 수정은 Changenumber를 하드 코드하는 것입니다, 메타베이션 탐색기, 메타베이스를 편집하기위한 .NET 유틸리티 또는 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에서 값을 설정하고 다시 시작하면이 값을 프로그래밍 방식으로 설정하는 방법이 있습니까?

내 최선의 생각은 (AB) Metabase Explorer와 함께 제공되는 iismblib.dll을 사용하는 것입니다. 누군가 이것을 사용한 경험이 있다면 듣고 싶습니다.

참조 :

도움이 되었습니까?

해결책 2

내 최선의 생각은 꽤 좋았습니다. 다음은 IIS 6.0 리소스 키트의 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);
        }

다른 팁

CRB, 훌륭한 솔루션에 감사드립니다. 대안을 찾을 수 없었습니다 (이전에 Custom Isapi가 사용하는 까다로운 ADSI 스크립팅을 통해 IIS 6 스키마에 자신의 사용자 정의 대사 속성을 추가했습니다).

다음은 솔루션의 PowerShell 버전입니다. MB Explorer Assembly가 로컬로 복사 한 것으로 가정합니다.

$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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top