다음을 통해 공유


URL 다시 쓰기 모듈에 대한 사용자 지정 다시 쓰기 공급자 개발

작성자 : Ruslan Yakushev

이 연습에서는 URL 다시 쓰기 모듈 2.0용 다시 쓰기 공급자를 개발하는 방법을 안내합니다. URL에서 특정 문자의 모든 발생을 다른 문자로 바꾸는 ReplaceProvider를 만듭니다. 이러한 종류의 논리는 정규식 측면에서 표현하기가 매우 어렵고 때로는 불가능하므로 사용자 지정 다시 쓰기 공급자를 만들어야 합니다.

Visual Studio 프로젝트 만들기

다시 쓰기 공급자를 위한 Visual Studio 프로젝트를 만들려면 다음 단계를 수행합니다.

  1. Microsoft Visual Studio 2008 또는 Microsoft Visual C# 2008 Express Edition을 엽니다.

  2. 파일 메뉴에서 "새 프로젝트..."를 선택합니다.

  3. "새 프로젝트" 대화 상자에서 "클래스 라이브러리" 프로젝트 템플릿을 선택하고 프로젝트 이름을 ReplaceProvider로 지정합니다.
    클래스 라이브러리 프로젝트 템플릿 옵션이 강조 표시된 새 프로젝트 대화 상자의 스크린샷

  4. 솔루션 탐색기 상황에 맞는 메뉴 삭제 옵션을 사용하여 기본적으로 추가된 Class1.cs 파일을 제거합니다(해당 파일을 사용하지 않기 때문에).

  5. "참조 추가..."를 선택합니다. 프로젝트 메뉴에서 에 있는 Microsoft.Web.Iis.Rewrite.dll 대한 참조를 %ProgramFiles%\Reference Assemblies\Microsoft\IIS추가합니다.

  6. URL 다시 쓰기 모듈에 표시하려면 다시 쓰기 공급자를 .NET GAC(전역 어셈블리 캐시)에 배치해야 합니다. 이렇게 하려면 공급자 어셈블리 DLL의 이름을 강력하게 지정해야 합니다(서명됨). 어셈블리에 서명하려면 "ReplaceProvider 속성..." 옵션을 선택합니다. "프로젝트" 메뉴에서

  7. 서명 탭에서 "어셈블리 서명" 검사 상자를 검사.

  8. 콤보 상자에서 새로 만들기...> 옵션을 <선택하여 새 키를 만듭니다. "강력한 이름 키 만들기" 대화 상자에서 키 이름으로 DemoKey.snk를 입력하고 암호 검사 사용하여 내 키 파일 보호 확인란의 선택을 취소합니다. 확인을 클릭합니다.
    키 파일 이름, 암호 입력 및 암호 확인 필드가 포함된 강력한 이름 키 만들기 대화 상자의 스크린샷
    서명 탭은 다음과 같습니다.
    강력한 이름 키 파일 선택 필드에 입력한 키 파일 이름을 보여 주는 서명 탭의 스크린샷

  9. "빌드 이벤트" 탭을 선택하고 다음 "빌드 후 이벤트" 명령줄을 추가합니다.

    NULL 호출 %VS90COMNTOOLS%\vsvars32.bat>
    gacutil.exe /if "$(TargetPath)"

    참고: Visual Studio 2010을 사용하는 경우 %VS90COMNTOOLS%를 %VS100COMNTOOLS%로 바꿉니다.

공급자 인터페이스 구현

다시 쓰기 공급자를 구현하려면 다음 단계를 수행합니다.

  1. 프로젝트 메뉴에서 "클래스 추가..."를 선택한 다음 클래스 이름을 ReplaceProvider로 지정합니다. 그러면 프로젝트에 새 파일 ReplaceProvider.cs 가 추가됩니다.
  2. 아래와 같이 코드를 변경합니다.
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Iis.Rewrite;

public class ReplaceProvider: IRewriteProvider, IProviderDescriptor
{
    char oldChar, newChar;

    #region IRewriteProvider Members

    public void Initialize(IDictionary<string, string> settings, IRewriteContext rewriteContext)
    {
        string oldCharString, newCharString;

        if (!settings.TryGetValue("OldChar", out oldCharString) || string.IsNullOrEmpty(oldCharString))
            throw new ArgumentException("OldChar provider setting is required and cannot be empty");

        if (!settings.TryGetValue("NewChar", out newCharString) || string.IsNullOrEmpty(newCharString))
            throw new ArgumentException("NewChar provider setting is required and cannot be empty");

        if (!string.IsNullOrEmpty(oldCharString))
            oldChar = oldCharString.Trim()[0];
        else
            throw new ArgumentException("OldChar parameter cannot be empty");

        if (!string.IsNullOrEmpty(newCharString))
            newChar = newCharString.Trim()[0];
        else
            throw new ArgumentException("NewChar parameter cannot be empty");
    }

    public string Rewrite(string value)
    {
        return value.Replace(oldChar, newChar);
    }

    #endregion

    #region IProviderDescriptor Members

    public IEnumerable<SettingDescriptor> GetSettings()
    {
        yield return new SettingDescriptor("OldChar", "Old Character");
        yield return new SettingDescriptor("NewChar", "New Character");
    }

    #endregion
}

위의 코드는 다음 두 인터페이스를 구현합니다.

IRewriteProvider - 구현해야 하는 기본 인터페이스입니다. 구성 설정에 전달하여 공급자를 초기화하는 데 사용됩니다. 또한 공급자를 실행하는 데 사용됩니다.

IProviderDescriptor - 선택적 인터페이스이며 공급자가 사용하는 구성 설정의 이름 및 설명에 대해 IIS 관리자에게 알리는 데 사용할 수 있습니다.

공급자 등록 및 구성

공급자가 성공적으로 빌드되고 GAC에 배치되면 IIS URL 다시 쓰기 모듈에 등록해야 합니다. 공급자를 등록하려면 다음을 수행합니다.

  1. IIS 관리자를 열고 URL 다시 쓰기 기능을 선택합니다.
  2. "공급자 보기..."를 클릭합니다. 작업:
    작업 창의 공급자 관리 섹션에 있는 공급자 보기 옵션에 포커스가 있는 I S 관리자의 스크린샷
  3. 공급자 페이지에서 공급자 추가...를 클릭합니다. 작업을 수행하고 공급자 이름을 ReplaceProvider로 입력하고 관리되는 형식: 드롭다운 목록에서 공급자 유형을 선택합니다.
    작업 창의 공급자 보기 옵션 스크린샷
  4. 확인을 클릭하여 변경 내용을 저장합니다.
  5. 이제 "공급자 설정 추가..."를 클릭합니다. 작업. "Name:" 드롭다운 목록에는 IProviderDescriptor.GetSettings() 메서드에서 반환된 설정이 표시됩니다. 이전 문자 설정을 선택하고 값으로 "_"를 입력합니다.
    I S 관리자 화면의 공급자 다시 쓰기 섹션에 있는 공급자 설정 편집 화면의 스크린샷
  6. 확인을 클릭하여 설정을 저장합니다.
  7. 5단계와 6단계를 반복하지만 이제 "새 문자"를 선택하고 "-"를 값으로 지정합니다. 즉, 공급자는 "_" 문자의 모든 발생을 입력 문자열의 "-" 문자로 바꾸는 데 사용됩니다.

이렇게 하면 다시 쓰기 공급자의 등록 및 구성이 완료됩니다. 따라서 기본 웹 사이트에 대한 web.config 파일에는 섹션 내에 다음 XML 코드가 <rewrite> 포함됩니다.

<rewrite>
    <providers>
        <provider name="ReplaceProvider" type="ReplaceProvider, ReplaceProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=157df8edcf6cf889">
            <settings>
                <add key="OldChar" value="_" />
                <add key="NewChar" value="-" />
            </settings>
        </provider>
    </providers>
</rewrite>

다시 쓰기 공급자 사용

이제 다시 쓰기 공급자가 등록되었으므로 인바운드 및 아웃바운드 규칙에서 사용할 수 있습니다. 공급자를 테스트하려면 "_" 기호가 있는 URL에 대한 모든 요청을 해당 기호가 "-"로 대체되는 URL로 리디렉션하는 규칙을 만듭니다. 예를 들어 이와 http://localhost/some_blog_post/ 같은 URL에 대한 요청은 로 http://localhost/some-blog-post/리디렉션됩니다.

이 다시 쓰기 공급자를 사용하는 규칙을 만들려면 web.config 파일의 <rewrite> 요소 내에 다음 XML 코드를 추가합니다.

<rules>
    <rule name="ReplaceProviderTest" stopProcessing="true">
        <match url="_" />
        <action type="Redirect" url="{ReplaceProvider:{URL}}" />
    </rule>
</rules>

웹 브라우저를 열고 추가한 규칙으로 인해 브라우저가 리디렉션되었음을 확인하도록 http://localhost/some-blog-post/ 요청 http://localhost/some_blog_post/. 합니다. 서버에 이러한 파일 또는 디렉터리가 없으므로 웹 서버는 리디렉션된 URL에 대해 HTTP 404 오류를 반환하지만 이 연습의 목적과는 관련이 없습니다. 중요한 부분은 웹 서버가 사용자 지정 다시 쓰기 공급자를 사용한 규칙에 따라 리디렉션 응답을 실행했다는 것입니다.