본문 바로가기

프로그래밍/Delphi

DataSnap/REST ISAPI Dll 모듈 생성/디버깅/배포 방법

개요


Delphi XE 버전을 이용하여 IIS/Apache 등에서 사용할 수 있는 ISAPI 방식의 DLL 프로젝트를 생성하고 배포하는 방법을 이해 해 보자


RAD Studio XE는 이미 오래전 부터 제공되고 있던 DataSnap에 추가적인 특징을 추가 하였는데 Embacadero의 EDN 서비스에서 각각의 특징을 잘 알 수 있다.


여기서는 DataSnap/REST를 이용하여 ISAPI 필터를 빌드하고 Windows 2008 서버의 IIS 웹서버에 배포하는 방법에 대해 알아 본다.


DataSnap Wizard에서는 Stand-Alone 형 CGI 모듈을 개발할 수도 있지만 보다 장점이 많은 ISAPI를 이용해 보도록 한다.


ISAPI를 이용하는 장점들은 다음과 같이 요약하면

   - 기존 웹서버의 웹포트(http:80)를 공유하여 사용

   - IIS를 통해 어플리케이션의 구동을 관리

   - IIS에서 제공되는 SSL 인증을 이용



개발 및 디버깅 


DataSnap / REST ISAPI 필터를 제작하는 방법은 Stand-Alone형으로 VCL-Form을 이용하여 어플리케이션을 개발하고 디버깅하여 배포전에 테스트를 하는것이 용이하다.


DataSnap / REST VCL Form 생성하기 


DelphiXE > File > New > Other : "Delphi Projects" 선택 > "Data Snap Server" 노드 선택 > "Data Snap REST Application" 선택




"OK" 버튼 클릭을 통하여 어플리케이션 생성 마법사를 실행 한다.


"Stand-Alone VCL Application" 옵션은 DataSnap/REST 서버 어플리케이션을 생성/테스트하기 위한 가장 편리한 방법인데 언제든지 서버 어플리케이션을 시작/중지 시키면서 디버깅 할 수 있기 때문이다. 또한 테스트하고 싶은 구현된 기능을 VCL 메인 폼에서 직접 테스트할 수 있기 때문에 편리하다.


만일 DataSnap서버 모듈에 대한 자동화된 테스트를 하고자 할 때는 "Stand-Alone Console Application" 옵션을 선택하는 것이 좋은 대안이 될 수 있다.


모든 테스트가 끝나고 IIS 웹서버로 배포할 준비가 되었을 때 "ISAPI Dynamic Link Library"옵션을 사용하여 전환 시킬 수 있다.


"Next" 버튼을 클릭해 보자.





기본 사용포트는 "8080" 포트이며 원하는 웹서버 포트로 변경할 수 있다. 그러나 현재 배포된 웹서버에서 테스트하려고 할 때에는 80포트를 사용하게 되면 아직 ISAPI로 배포된 상태가 아니기 때문에 기존 웹서버와 충돌날 수 있으므로 VCL-Form을 이용하여 서버를 테스트 할 때는 8080 등 포트가 충돌나지 않도록 적절한 포트를 이용하면 되겠다. 포트가 이용 가능한지는 "Test Port"를 클릭 해 보면 알 수 있다.


"Next"를 클릭해 보자





인증은 제외하고 Hello World 프로그램처럼 기본적으로 테스트 할 수 있는 샘플 메소드(Method)와 웹 파일들을 자동 생성하기 위하여 "Server Methods Class" 를 모두 체크해 보자.
이 샘플 메소드는 DataSnap 서버의 기본적인 동작 매커니즘을 이해하는데 아주 큰 도움을 준다. 생성된 코드 그대로 배포하여 서버와 클라이언트간의 테스트가 가능하다. 본질적인 프로그램 개발 이후 언제든지 제거해도 된다.

"Next"클릭


데이터모듈 관리를 위해 본인이 선호하는 방식을 선택하도록 한다.


- TComponent : DataSnap Server를 위한 가장 단순한(경량) 모델로 비시각적인 컴포넌트들을 이용한 디자인 화면을 구성하지 않을 경우 사용

- TDataModule : 디자인 화면을 가지고 있을 경우 사용

- TDSServerModule : MIDAS등 nTier서버 인터페이스와의 호환성을 유지하기 위하여 선택


* "TDataModule" 선택


"Next" 클릭




프로젝트를 저장할 경로를 지정한다.


"Finish" 클릭으로 마법사를 완료 한다.






 
자동생성된 프로젝트 생성 파일들

* FormUnit1
서버폼(FORM)과 DATASNAP 서버의 시작/종료 테스트 버튼, "DataSnap Server"홈페이지 바로가기 버튼을 포함하고 있다.

* WebModuleUnit1
Stand-Alone형 웹서버 모듈을 위한 DataSnap 모듈들을 포함한다.
template , mime type, css, javascript, images 등을 지원할 수 있도록 폴더가 자동 생성된다.
또한 서버는 REST / JSON을 사용할 준비가 되어 있다.



* ServerMethodUnit1

이 모듈은 프로그래머가 웹서버 및 서버 RPC 마샬링등을 신경쓰지 않고 자신의 로직 개발에만 집중할 수 있도록 데모 로직이 담긴 샘플 코드 유닛.
이 유닛으로 부터 서버 모듈을 개발/확장해 나가면 될 것이다.






unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth;

type
{$METHODINFO ON}
  TServerMethods1 = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
  end;
{$METHODINFO OFF}

implementation

{$R *.dfm}

uses System.StrUtils;

function TServerMethods1.EchoString(Value: string): string;
begin
  Result := Value;
end;

function TServerMethods1.ReverseString(Value: string): string;
begin
  Result := System.StrUtils.ReverseString(Value);
end;

end.


위 코드에는 이미 "EchoString" 및 "ReverseString"이이미 구현된 샘플로 존재 한다.




DataSnap Server Application 프로그램 실행 


위프로그램을 컴파일하고 Target을 "32bit-Windows"하여 빌드 후 실행하면 다음과 같이 Stand-Alone형 서버 프로그램이 로딩 된다.




프로그램 시작과 동시에 자동 시작되며

현재 보안프로그램 동작에 의해 "8080" 포트에 대한 접속을 허용할 것인가 여부를 결정하는 다음과 같은 창이 나타날 수 있다. 여기서 "엑세스 허용"을 클릭해 주어야만 서버가 클라이언트의 요청에 대해 올바르게 동작 한다.






DataSnap Server Application 테스트


위 서버프로그램 실행을 통하여 Stand-Alone형 DataSnap Web Application Server가 실행되었다.

위 서버 모듈은 독립적으로 웹서버 응답 모듈을 포함하고 있으므로 일반 웹서버 접근하듯이 테스트 하면 된다.

다음과 같이 테스트를 위한 URL을 입력 해 보자(현재 테스트PC에서 실행되고 있으므로 도메인을 http://localhost로 확인해 보자





 "ReverseString" 버튼을 클릭하면 입력값 "A B C"의 역문자열인 "C B A"가 반환 되는 것을 확인 할 수 있다. 와우 정말 심플하게 잘 동작 한다. 서버단에서 어떠한 기능 동작을 하는 API도 만들어서 같은 매카니즘으로 이용이 가능해졌다.


이번에는 "Server Function"을 클릭해 보자

그러면 DataSnap Server가 제공하는 API 목록이 나타난다. 흡사 SOAP에서 WSDL을 보는 것과 유사한 개념이다.




친절하게도 우리가 만든 데모 DataSnap Application Server가 제공하는 "TServerMethods1"에 대한 API 목록이 나타나며 파라미터 규칙과 실제 값을 이용하여 테스트해 볼 수 있다. 테스트 결과는 JSON 형태로 리턴 되는 것을 알 수 있다.


** ReverseString API에 한글 문자열을 입력해 보자 > 제대로 안나온다... 왜냐면 역순 문자열 처리시 한글에 대한 고민이 없는 Demo 버전이기 때문이다. 이 글을 보고 있는 개발자라면 누구나 이를 해결할 능력이 있을 것이라 믿는다. 



접속 제한 처리


위에서 런칭한 데모 DataSnap Server Application에 접속권한 관리에 대해 잠깐 언급하면 서버 모듈의 WebModule에서 다음과 같이 접근되는 아이피 또는 MacAddress를 이용하여 접근 제한을 할 수 있도록 한다. 

여기서는 로컬호스트(localhost) 접근만 허용하도록 제한 해 보자.


function TWebModule2.AllowServerFunctionInvoker: Boolean;
begin
  Result := (Request.RemoteAddr = '127.0.0.1') or
    (Request.RemoteAddr = '0:0:0:0:0:0:0:1') or (Request.RemoteAddr = '::1');
end;



이제 나만의 API를 추가해 보자


in unit ServerMethodsUnit1


  TServerMethods1 = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
    function Add(x, y : Integer) : integer; // My Business Logic ^^
  end;
{$METHODINFO OFF}

implementation

{$R *.dfm}

uses System.StrUtils;

function TServerMethods1.Add(x, y : Integer): Integer;
begin
  Result := x + y;
end;

...

DataSnap Application Server 모듈을 재빌드(Rebuild)하여 재실행 해 보자

그리고 위와 같이 테스트하여 "Server Functions"를  클릭해 보자



너무 쉽게 추가하고 싶은 로직을 추가 하였다.

우리는 이제 웹서버 모듈을 이용하여 언제든 서버단의 로직을 개발할 수 있는 준비가 되어 있다. 너무 강력한 무기를 장착하게 되었다... ^^



ISAPI 모듈에서 DBExpress의 이용(from DBXUtils.pas)


ISAPI 모듈내에서 DBExpress를 이용하고자 할 경우 DATABASE를 연결하기 위하여 CreateConnection을 사용해야 할 수도 있다.

참고 : RAD Studio XE와 관련된 "RAD Studio demo project on Sourceforge"의 하위 디렉토리(Delphi/Database/dbExpress/Utils)에 보면 EDN 팀에서 "DBXUtils"를 이용하여 작성된 파워풀하고 유용한 유틸리티 함수들을 다수 발견할 수 있다.


CreateConnection은 간단한 호출을 통하여 TSQLConnection을 생성하고 Open하는 유틸리티 함수로, ".exe" 또는 ".dll"등 우리가 작성한 프로그램의 ".ini"에서 일반적으로 등록관리하고 있는 연결이름을 파라미터롤 전송하도록 한다. ".ini"에서 파라미터에 전달된 이름과 매핑된 데이터베이스 연결과 관련된 정보를 매핑한다. "dbxconnection.ini"와 같은 거의 동일한 파일로 로컬 연결을 정의하는 쉬운 방법이나 제품 서버에 우리가 개발한 응용 프로그램을 배포하는데 더 쉬운 매커니즘으로 이해하면 된다.

[Employee] Database=localhost:d:\ibdata\employee.ib UserName=sysdba Password=masterkey Driver=INTERBASE [EmployeeExtra] Dialect=3



위 .ini정보를 이용한 코드를 살펴 보자


///  
///  Create and open a TSQLConnection with the specified connection name
///  trying to open it a) first by trying application.ini then b) by
///  reading dbxconnections.ini if a) fails
///  
///  Name of connection to open
///  Optional. Name of the Ini file.
///  Defaults to the application name + '.ini'
///  
///  The object returned will need to be freed in the caller
///  
function CreateConnection(const AName: string;
  AIniFile: string = ''): TSQLConnection;
var
  error1: string;
begin
  try
    if FileExists(ModuleIniFile) then
      Result := CreateConnectionIni(AName)
    else
    begin
      Result := nil;
      error1 := Format(StrIniWasNotFound, [ModuleIniFile]);
    end;
  except
    on E: Exception do
    begin
      error1 := E.Message;
      Result := nil;
    end;
  end;
  if not Assigned(Result) then
    try
      Result := CreateConnectionName(AName);
    except
      on E: Exception do
      begin
        raise Exception.CreateFmt(StrCouldNotOpenConnection,
          [AName, error1, E.Message] );
      end;
    end;
end; 

여기서 .ini 파일을 찾지 못하면 CreateConnection은 예외를 발생 시키고 "dbxconnections.ini"를 참조하여 기본 정의된 연결 정보를 사용하여 DATABASE 연결을 시도 하게 된다.


또한 서버메소드 모듈에 따른 각각의 데이터베이스 연결정보를 관리 할 수도 있다.

다음 코드를 보면 모듈별 연결 정보를 관리할 수 있도록 하는 예제이다.


interface
...
  Private
    FConnection: TSQLConnection;
    function GetConnection: TSQLConnection;
  public
    property Connection: TSQLConnection read GetConnection;
    destructor Destroy; override;


implementation
...
function TRoleCall.GetConnection: TSQLConnection;
begin
  if not Assigned(FConnection) then
    FConnection := CreateConnection(SConnectionName);
  if FConnection.ConnectionState <> csStateOpen then
    FConnection.Open;
  Result := FConnection;
end;
destructor TRoleCall.Destroy;
begin
  if Assigned(FConnection) then
  begin
    FConnection.Close;
    FreeAndNil(FConnection);
  end;
  inherited;
end;

CreateConnection은 ISAPI dll 을 사용할때에는 부분적으로 제한되어 사용될 수 있음을 인지 해야 한다. 왜냐 하면 웹서버(예:IIS)에 설치된 버전은 하나라서 설치된 경로(DataSnal.dll이 배포된 경로)의 .ini를 찾는 것이 아니라 dbExpress런타임 모듈이 dbxconnections.ini 파일을 찾기 때문이다. 따라서 이를 방지하기 위해서는 프로그램 내에서 지정된 로컬 경로의 ".ini"파일을 찾도록 변경해야 할 필요가 있으니 주의 해야 한다.



ISAPI dll 모듈로 서버 전환


Stand-Alone 유형으로 만든 DataSnap 서버가 원하는대로 동작 한다면 IIS등 웹서버의 80 포트등 http 포트를 공유하여 사용될 수 있도록 ISAPI dll Server로 전환 할 수 있다.


위에서 가장 처음에 했던 것 처럼 위자드를 실행하여 ISAPI Dll 모델로 프로젝트를 생성한다.




"Next" 클릭 하면 Server Feature는 동일하게 "Server Method Class"만 체크후 "Next" 클릭


"Server Methods ancestor class"에서도 "TDataModule" 선택 후 "Next"클릭




저장경로를 달리하여 "Finish" 클릭


다음단계로 모든 프로젝트 파일을 저장하고 "File | Close All" 버튼을 눌러서 프로젝트를 닫는다.




VCL 프로젝트(.exe)에서 ISAPI 프로젝트로 파일 복사하기


여기서 새 프로젝트에서는 ISAPI프로젝트의 특정 파일을 VCL 프로젝트로 복사하여 사용하게 한다.

먼저 파일 복사를 위하여 익스플로러를 열어서 지금 생성한 ISAPI 프로젝트의 .dpr, .dproj 파일을 먼저 생성했던 VCL 프로젝트 경로로 복사한다.

그다음 먼저 생성했던 VCL 프로젝트 경로에서 복사한 프로젝트를 오픈 해 보자.

그러면 기존 VCL 프로젝트 생성할때 자동 생성되었던 ServerMethodUnit1 과 WebModuleUnit1이 ISAPI 프로젝트 생성시와 동일한 파일명으로 생성 되었었기 때문에 단지 프로젝트 파일만 옮겼어도 ISAPI로 VCL 프로젝트에서 작성했던 코드를 불러올 수 있다.

이변이 없는 한 프로젝트 파일만 복사 후 로딩된 프로젝트를 빌드 하면 .dll 파일이 생성되는데 아무런 오류가 발생하지 않을 것이다.




오른쪽 프로젝트 그룹에 보면 최종 산출물이 ".dll"인 것을 알 수 있다.

빌드 하면 프로젝트 경로 > Win32 > Debug에 빌드된 ".DLL" 파일을 찾을 수 있다.




DataSnap/REST VCL Project  vs DataSnap/REST ISAPI Project


VCL프로젝트와 ISAPI 프로젝트로 생성했을 경우 프로젝트 파일의 소스를 비교해 봄으로 써 굳이 새 프로젝트를 생성하지 않아도 프로젝트 파일 소스의 변경을 통해 VCL프로젝트를 ISAPI(DLL) 프로젝트로 변경할 수 있다.


그러나 디버깅 및 테스트를 병행 하기 위해서는 내부 비즈니스 로직을 공유하면서 VCL 프로젝트와 ISAPI(DLL) 프로젝트를 전환 하면서 개발을 진행 하는 것을 권한다. 한 번에 완벽한 개발을 할 수 있으면 좋으련만, 수없이 많은 디버깅 작업을 반복하게 될 것이기 때문이다.


VCL Project Source


program testDataSnapNRest;
{$APPTYPE GUI}

{$R *.dres}

uses
  Vcl.Forms,
  Web.WebReq,
  IdHTTPWebBrokerBridge,
  FormUnit1 in 'FormUnit1.pas' {Form1},
  ServerMethodsUnit1 in 'ServerMethodsUnit1.pas' {ServerMethods1: TDataModule},
  WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule};

{$R *.res}

begin
  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass := WebModuleClass;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


ISAPI Project Source


library testDataSnapNRestISAPI;

{$R *.dres}

uses
  Winapi.ActiveX,
  System.Win.ComObj,
  Web.WebBroker,
  Web.Win.ISAPIApp,
  Web.Win.ISAPIThreadPool,
  Data.DBXCommon,
  Datasnap.DSSession,
  ServerMethodsUnit1 in 'ServerMethodsUnit1.pas' {ServerMethods1: TDataModule},
  WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule};

{$R *.res}

exports
  GetExtensionVersion,
  HttpExtensionProc,
  TerminateExtension;

procedure TerminateThreads;
begin
  TDSSessionManager.Instance.Free;
  Data.DBXCommon.TDBXScheduler.Instance.Free;
end;

begin
  CoInitFlags := COINIT_MULTITHREADED;
  Application.Initialize;
  Application.WebModuleClass := WebModuleClass;
  TISAPIApplication(Application).OnTerminate := TerminateThreads;
  Application.Run;
end.



MIDAS.DLL 사용하기


우리가 만든 DataSnap 어플리케이션 또는 ISAPI DLL이 dataset을 사용한다면 프로젝트의 소스 코드에 "MidasLib" 유닛을 포함 시켜야 한다. 그렇게 하면 "MIDAS.DLL"을 배포하거나 등록하지 않아도 되므로 배포가 단순해 진다.


다음과 같이 현재 프로젝트의 "View Source" 메뉴를 이용하여 프로젝트 소스를 살펴 보면



library testDataSnapNRestISAPI;

{$R *.dres}

uses
  Winapi.ActiveX,
  System.Win.ComObj,
  Web.WebBroker,
  Web.Win.ISAPIApp,
  Web.Win.ISAPIThreadPool,
  Data.DBXCommon,
  Datasnap.DSSession,
  MidasLib, // Add MIDAS Library Unit
  ServerMethodsUnit1 in 'ServerMethodsUnit1.pas' {ServerMethods1: TDataModule},
  WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule};


IIS 7.5에서 ISAPI 모듈 테스트


위에서 작성한 ISAPI 프로젝트를 빌드 하면 "DLL" 파일이 생성 되는데 이 DataSnap Server 모듈을 IIS에 배포하여 테스트 해 보자


기본적으로 IIS가 ISAPI(.dll) 모듈을 이해하기 위해서는 여러 단계의 작업이 필요하지만 한 번 해 놓으면 그 다음부터 추가되는 모듈은 간단히 추가할 수 있다. - 이부분에서 많은 시행착오가 생긴다..(IIS가 생각대로 동작하지 않기도 한다. ㅠ.ㅠ)


다음 단계를 차분하게 따라해 보자



STEP #1. IIS에 ISAPI 활성화 시키기


IIS의 ROOT(메인 노드, Machine Name)를 선택후 오른쪽 창의 "보안" 섹션의 "ISAPI 및 CGI제한"을 더블클릭




우측의 "기능 설정 편집" 클릭



"지정하지 않은 ISAPI 모듈 허용(S)" 체크 후 "확인" 클릭





STEP #2. IIS에 ISAPI 모듈이 저장된 경로에 대한 가상경로(Virtual Directory) 생성


테스트하고자 하는 웹사이트를 선택 후 오른쪽 마우스 버튼을 클릭하여 다음과 같이 가상 경로 설정






우리가 개발한 ISAPI(.dll, 예:testDataSnapNRestISAPI.dll) 이 저장된 위치를 가상경로를 지정 후 "확인" 버튼 클릭


추가된 가상 경로를 어플리케이션으로 변경한다.

변경할 가상경로를 선택하고 오른쪽 마우스 버튼을 클릭 후 "응용 프로그램으로 변환" 메뉴 클릭



다음과 같이 기존 가상경로 노드를 응용어플리케이션으로 변환하는 창이 나오고 기본으로 설정된 값을 유지한 채 "확인" 버튼 클릭






STEP #3. 어플리케이션풀에 사용자 권한 주기


IIS6에서 IIS7으로 넘어가면서 보안과 관련된 동작이 변경 되었다. IIS 7.5의 계정 및 보안 관련된 추가 정보는 "learn.iis.net web site" 를 참고.


계정정보에 대한 접근은 IIS 7.5의 응용프로그램 풀을 선택하면 볼 수 있는데 응용프로그램 풀을 선택하고 "DefaultAppPool"을 선택 한 후 "고급설정"을 선택한다.




고급설정 창에서 "프로세스 모델" 섹션의 "ID" 노드의 "..." 버튼을 클릭한다


Application Pool account 창에서 빌트인(Build-In) 계정중 "ApplicationPoolIdentity"를 지정한다




만일 윈도우즈 OS가 64Bit일 경우에 고급설정 창에서 "32-Bit Application"을 True로 활성화 시켜 주어야 한다.(32bit어플리케이션일 경우)


"OK" 버튼을 클릭하여 설정을 종료하고 고급설정 창도 닫는다.

이렇게 하면 응용프로그램 풀에 대하여 적당한 계정이 설정되고, DataSnap 프로젝트 폴더에 대한 적절한 권한 설정을 할 수 있게 된다.



STEP #4. IIS User 계정을 프로젝트 폴더에 "쓰기(write)"권한 주기


DataSnap 프로젝트 폴더에 대한 쓰기 권한은 기본 제공되는 DataSnap REST서버의 로직이 우리가 새롭게 추가한 커스텀 로직에 대한 자바스크립트 프록시 파일을 자동으로 업데이트 되도록 하기 위해 필요하다. 다음 루틴은 자동 업데이트가 어떻게 처리되는지를 보여 주는 소스 코드이다.


procedure TWebModule1.WebFileDispatcher1BeforeDispatch(Sender: TObject;
  const AFileName: string; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  D1, D2: TDateTime;
begin
  Handled := False;
  if SameFileName(ExtractFileName(AFileName), 'serverfunctions.js') then
    if not FileExists(AFileName) or (FileAge(AFileName, D1) and FileAge(WebApplicationFileName, D2) and (D1 < D2)) then
    begin
      DSProxyGenerator1.TargetDirectory := ExtractFilePath(AFileName);
      DSProxyGenerator1.TargetUnitName := ExtractFileName(AFileName);
      DSProxyGenerator1.Write;
    end;
end;

위 루틴으로 인하여 응용프로그램의 사용자 로직은 항상 자바스크립트 인터페이스와 자동으로 연동처리 되는 것을 보장 받을 수 있게 된다. 위 코드는 소스 레벨에서 수정이 가능하기 때문에 의도적으로 수정되어질 수 있지만 DLL파일이 있는 경로에 대한 쓰기 권한은 항상 요구되어진다.


* js폴더는 우리의 프로젝트에서 쓰기 권한이 항상 필요로 되는 폴더임을 명심해야 한다.


권한 설정은 두가지 방법이 있다


첫번 째 : IIS 7.5 관리 프로그램을 이용하는 방법


IIS 7.5에서 대상 가상 폴더를 선택하고 "사용권한 편집"을 이용하여 가상 디렉토리에 대해 적당한 권한을 설정해 줄 수 있다.


두번 째 : windows Explorer를 이용하여 프로젝트 폴더에 대해 직접 권한을 할당 하는 방법


특정 폴더를 선택하고 오른쪽 마우스 버튼을 클릭하여 "속성"을 클릭한다.




편집 > 추가 > 사용자 또는 그룹선택 창 >에서 "선택할 개체 이름을 입력하십시오" 편집창에 


DefaultAppPool을 입력한 후 권한에 "쓰기"권한을 추가한다.


* 위에서 DefaultAppPool 계정이 존재하지 않는경우가 있는데 이때를 대비하여 빌트인 Account를 "Network Service"로 지정하여 상기 작업을 재시도 해 보자. 이때 상기 프로세스모델의 "ID"도 "Network Service"로 변경해 보아야 할 것이다.


"확인" 버튼을 클릭하여 설정을 완료 한다.



STEP #5. 가상경로에 대한 인증정보 설정


가상 경로는 어플리케이션풀의 ID에 대해 그것의 인증을 위하여 인증에 대한 설정이 필요하다.

IIS에서 가상 경로를 선택하고 인증을 선택하고 더블클릭 한다.



인증창에 기본 등록된 "익명 인증"을 선택 후 "편집" 클릭


  

아래 "익명 인증 자격 증명 편집"에서 "응용 프로그램 풀 ID"를 선택한다

기본 값은 "사용자 지정"으로 되어 있는데 이 지정 여부에 따라 자격없음으로 인하여 500 Error가 발생되는 경우가 있는것 같다.



"확인" 버튼을 클릭하여 설정을 완료해 보자.



STEP #6. 설정결과 테스트


브라우저를 열어서 해당 ISAPI DLL 모듈의 위치한 주소 URL입력시 다음과 같이 나타나게 되면 뭔가 설정이 잘못 된 경우이니 되돌아 가서 설정을 살펴 보자



정상이라면 다음과 같은 화면을 볼 수 있다.



* 배포시 주의 해야 할 점은 DLL 빋드시 .dll이 있는 경로의 다음 디렉토리까지 배포 해야 한다,

css

images

js

templates