연습: 호스트된 Web Core 애플리케이션 만들기
이 연습에서는 IIS 7에서 사용할 수 있는 Hosted Web Core 기능을 사용하는 Windows 콘솔 애플리케이션을 만드는 방법을 보여 줍니다.
IIS 7의 호스트된 Web Core 기능을 사용하면 IIS에서 제공하는 기본 웹 애플리케이션 및 콘텐츠 제공 기능인 IIS 코어의 instance 로드하는 애플리케이션을 만들 수 있습니다. Hosted Web Core에 대한 자세한 내용은 Hosted Web Core API 참조를 참조하세요.
ApplicationHost.config 파일의 형식을 따르는 애플리케이션에 대한 구성 파일을 제공해야 합니다. 그러나 웹 사이트 설정과 충돌하는 설정이 포함될 수 있으므로 실제 ApplicationHost.config 파일을 사용하면 안 됩니다. 애플리케이션에 대한 구성 파일을 만드는 방법에 대한 자세한 내용은 연습: Hosted Web Core에 대한 구성 파일 만들기를 참조하세요.
이 연습에서 수행할 작업은 다음과 같습니다.
애플리케이션에 대한 C++ 프로젝트 만들기
애플리케이션에 대한 C++ 코드 추가
애플리케이션 컴파일 및 테스트.
애플리케이션을 사용할 때 발생하는 오류 문제 해결
사전 요구 사항
예제의 단계를 완료하려면 다음 소프트웨어가 필요합니다.
- IIS 7.
참고
IIS 7이 설치된 컴퓨터에서 Hosted Web Core 애플리케이션을 실행해야 하지만 IIS 7이 설치된 컴퓨터에서 예제 애플리케이션을 컴파일할 필요는 없습니다. 다른 버전의 Windows에서 애플리케이션을 컴파일한 다음 IIS 7이 설치된 컴퓨터에 애플리케이션을 복사할 수 있습니다.
- Visual Studio 2005.
참고
연습 단계가 동일하지 않을 수도 있지만 Visual Studio .NET 2003 이하를 사용할 수도 있습니다.
호스트된 Web Core 애플리케이션 만들기
연습의 이 부분에서는 애플리케이션에 대한 C++ 콘솔 애플리케이션 프로젝트를 만듭니다.
애플리케이션에 대한 C++ 프로젝트를 만들려면
Visual Studio 2005를 시작합니다.
전역 옵션에 SDK에 대한 모든 올바른 경로에 파일이 포함되어 있는지 확인합니다.
도구 메뉴에서 옵션을 클릭합니다.
옵션 대화 상자가 열립니다.
트리 뷰에서 프로젝트 및 솔루션 노드를 확장한 다음 VC++ 디렉터리를 클릭합니다.
디렉터리 표시 상자에서 파일 포함을 선택합니다.
SDK 포함 파일을 설치한 경로가 나열되어 있는지 확인합니다. 경로가 나열되지 않은 경우 새 줄 아이콘을 클릭한 다음 SDK 포함 파일을 설치한 경로를 추가합니다.
확인을 클릭합니다.
새 C++ 프로젝트를 만듭니다.
파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
새 프로젝트 대화 상자가 열립니다.
프로젝트 형식 창에서 Visual C++ 노드를 확장한 다음 Win32를 클릭합니다.
템플릿 창에서 Win32 프로젝트를 클릭합니다.
이름 상자에 HostedWebTest를 입력합니다.
위치 상자에 프로젝트의 경로를 입력합니다.
확인을 클릭합니다.
Win32 애플리케이션 마법사가 열립니다.
애플리케이션 설정을 클릭합니다.
애플리케이션 유형에서 콘솔 애플리케이션을 클릭합니다.
Finish를 클릭합니다.
Visual Studio에서 HostWebTest.cpp 프로젝트를 엽니다.
호출 규칙을 사용하여
__stdcall (/Gz)
컴파일하도록 프로젝트를 구성합니다.프로젝트 메뉴에서 HostedWebTest 속성을 클릭합니다.
트리 뷰에서 구성 속성 노드를 확장하고 C/C++ 노드를 확장한 다음 고급을 클릭합니다.
구성 상자에서 모든 구성을 선택합니다.
호출 규칙 상자에서 __stdcall(/Gz)를 선택합니다.
확인을 클릭합니다.
애플리케이션에 대한 코드 추가
이 섹션에서는 C++ 파일에 자동으로 추가된 코드를 Hosted Web Core를 실행하는 코드로 바꾸는 방법을 보여 있습니다.
참고
이 예제에서는 Inetsrv 폴더에서 HostedWebTest.config 파일을 찾습니다. 경로 및 파일 이름을 수정할 수 있지만 유효한 구성 파일을 제공해야 합니다. 애플리케이션에 대한 구성 파일을 만드는 방법에 대한 자세한 내용은 연습: Hosted Web Core에 대한 구성 파일 만들기를 참조하세요.
애플리케이션에 대한 C++ 코드를 추가하려면
HostedWebTest.cpp 파일을 아직 열지 않은 경우 열고 기존 C++ 코드를 모두 제거합니다.
다음 C++ 코드를 파일에 복사합니다.
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <conio.h> #include <hwebcore.h> // NOTE: Set the project's calling convention to "__stdcall (/Gz)". HRESULT _cdecl _tmain(int argc, _TCHAR* argv[]) { // Create a handle for the Web core DLL. HINSTANCE hDLL; // Specify the HRESULT for returning errors. HRESULT hr = S_OK; // Create arrays to hold paths. WCHAR wszInetPath[MAX_PATH]; WCHAR wszDllPath[MAX_PATH]; WCHAR wszCfgPath[MAX_PATH]; // Retrieve the path of the Inetsrv folder. DWORD nSize = ::ExpandEnvironmentStringsW( L"%windir%\\system32\\inetsrv",wszInetPath,MAX_PATH); // Exit if the path of the Inetsrv folder cannot be determined. if (nSize == 0) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not determine the path to the Inetsrv folder.\n"); printf("Error: 0x%x\n",hr); // Return an error from the application and exit. return hr; } // Append the Web core DLL name to the Inetsrv path. wcscpy_s(wszDllPath,MAX_PATH-1,wszInetPath); wcscat_s(wszDllPath,MAX_PATH-1,L"\\"); wcscat_s(wszDllPath,MAX_PATH-1,WEB_CORE_DLL_NAME); // Append the config file name to the Inetsrv path. wcscpy_s(wszCfgPath,MAX_PATH-1,wszInetPath); wcscat_s(wszCfgPath,MAX_PATH-1,L"\\HostedWebTest.config"); // Create a pointer to WebCoreActivate. PFN_WEB_CORE_ACTIVATE pfnWebCoreActivate = NULL; // Create a pointer to WebCoreShutdown. PFN_WEB_CORE_SHUTDOWN pfnWebCoreShutdown = NULL; // Load the Web core DLL. hDLL = ::LoadLibraryW(wszDllPath); // Test whether the Web core DLL was loaded successfully. if (hDLL == NULL) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not load DLL.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("DLL loaded successfully.\n"); // Retrieve the address for "WebCoreActivate". pfnWebCoreActivate = (PFN_WEB_CORE_ACTIVATE)GetProcAddress( hDLL,"WebCoreActivate"); // Test for an error. if (pfnWebCoreActivate==NULL) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not resolve WebCoreActivate.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreActivate successfully resolved.\n"); // Retrieve the address for "WebCoreShutdown". pfnWebCoreShutdown = (PFN_WEB_CORE_SHUTDOWN)GetProcAddress( hDLL,"WebCoreShutdown"); // Test for an error. if (pfnWebCoreShutdown==NULL) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not resolve WebCoreShutdown.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreShutdown successfully resolved.\n"); // Return an activation status to the console. printf("Activating the Web core...\n"); // Activate the Web core. hr = pfnWebCoreActivate(wszCfgPath,L"",L"TestWebCore"); // Test for an error. if (FAILED(hr)) { // Return an error status to the console. printf("WebCoreActivate failed.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreActivate was successful.\n"); // Prompt the user to continue. printf("Press any key to continue...\n"); // Wait for a key press. int iKeyPress = _getch(); // Return a shutdown status to the console. printf("Shutting down the Web core...\n"); // Shut down the Web core. hr = pfnWebCoreShutdown(0L); // Test for an error. if (FAILED(hr)) { // Return an error status to the console. printf("WebCoreShutdown failed.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreShutdown was successful.\n"); } } } } // Release the DLL. FreeLibrary(hDLL); } // Return the application status. return hr; }
HostedWebTest.cpp 파일을 저장합니다.
애플리케이션 컴파일 및 테스트
C++ 파일을 만들고 저장한 후 다음 단계는 애플리케이션을 컴파일하고 테스트하는 것입니다.
참고
IIS 7이 설치된 컴퓨터에서 애플리케이션을 컴파일하지 않는 경우 애플리케이션을 테스트하기 전에 IIS 7이 설치된 컴퓨터에 HostedWebTest.exe 파일을 복사해야 합니다.
애플리케이션을 컴파일하고 테스트하려면
애플리케이션을 컴파일합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
Visual Studio에서 오류 또는 경고를 반환하지 않았는지 확인합니다. 오류 또는 경고가 표시되면 프로젝트를 테스트하기 전에 해당 문제를 resolve 합니다.
Windows Explorer 열고 C++ 프로젝트를 만들 때 지정한 폴더를 찾습니다.
빌드 옵션에 따라 프로젝트의 기본 폴더에 디버그 또는 릴리스 라는 폴더가 표시됩니다.
디버그 또는 릴리스 폴더 내에서 HostedWebTest.exe 파일을 찾습니다.
구성 파일이 애플리케이션에 적합한 폴더에 있는지 확인합니다. 예를 들어 이 연습의 앞부분에 나열된 코드 예제는 Inetsrv 폴더에 있는 HostedWebTest.config 파일을 사용하도록 설계되었습니다.
명령 프롬프트 창을 열고 디렉터리를 HostedWebTest.exe 파일이 있는 경로로 변경합니다.
HostedWebTest를 입력하고 Enter 키를 눌러 애플리케이션을 시작합니다.
다음과 유사한 애플리케이션의 출력이 표시됩니다.
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate was successful. Press any key to continue...
키보드에서 키를 누르지 않고 명령 프롬프트 창을 최소화합니다.
구성 설정에 따라 웹 브라우저를 열고 구성 파일에 정의된 웹 사이트를 찾아볼 수 있습니다.
웹 사이트로의 검색을 마쳤으면 명령 프롬프트 창으로 돌아가 스페이스바를 누릅니다.
다음과 유사한 애플리케이션의 출력이 표시됩니다.
Shutting down the Web core... WebCoreShutdown was successful.
오류 문제 해결
애플리케이션이 로드되지 않거나 실행 중일 때 오류를 반환하는 경우 다음 단계를 통해 발생할 수 있는 일부 오류를 진단할 수 있습니다.
애플리케이션의 오류를 해결하려면
애플리케이션이 다음 오류를 반환하는 경우:
Could not load DLL. Error: 0x8007007e
이것은 ERROR_MOD_NOT_FOUND 상태. 이 오류는 Hwebcore.dll 파일을 찾을 수 없음을 나타냅니다. IIS가 설치되지 않은 경우 이 오류가 발생합니다.
애플리케이션이 다음 오류를 반환하는 경우:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate failed. Error: 0x8007000d
이것은 ERROR_INVALID_DATA 상태. 이 오류는 구성 파일을 찾을 수 없거나 오류가 포함되어 있음을 나타냅니다. Windows 이벤트 뷰어 추가 오류 설명을 확인해야 합니다.
애플리케이션이 다음 오류를 반환하는 경우:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate failed. Error: 0x800700b7
이것은 ERROR_ALREADY_EXISTS 상태. 이 오류는 구성 파일이 로드되었지만 중복 정보가 포함되어 있음을 나타냅니다. 예를 들어 둘 이상의 애플리케이션 풀을 정의했거나 중복된 웹 사이트 바인딩을 만들었을 수 있습니다. 추가 오류 설명은 Windows 이벤트 뷰어 검사해야 합니다.
애플리케이션이 성공적으로 로드되지만 애플리케이션에서 호스트하는 웹 사이트를 찾아볼 때 HTTP 404 오류가 표시되는 경우 애플리케이션에서 만든 IIS 로그에서 404 하위 상태 코드에 대해 검사해야 합니다. 다음은 표시할 수 있는 몇 가지 하위 상태 코드입니다.
404.3 "Mime Map에서 거부됨" - 이 하위 상태 코드는 요청된 리소스의 MIME 형식이 올바르게 구성되지 않음을 나타냅니다. 예를 들어 .txt 파일 이름 확장명이 있는 파일로 이동하여 구성 파일의 MIME 맵에 해당 확장명을 추가하지 않은 경우 이 코드가 발생합니다.
404.4 "처리기 없음"- 이 하위 상태 코드는 요청된 리소스에 대해 처리기가 구성되지 않음을 나타냅니다. 예를 들어 .htm 파일 이름 확장명이 있는 파일로 이동하고 구성 파일에 정적 파일 처리기를 추가하지 않은 경우 이 코드가 발생합니다.
404.7 "파일 확장명 거부됨"- 이 하위 상태 코드는 요청 필터링으로 파일 이름 확장명을 차단했음을 나타냅니다. 예를 들어 .gif 파일 이름 확장명이 있는 파일로 이동하고 해당 확장명이 있는 파일에 대한 액세스를 거부하도록 요청 필터링을 구성한 경우 이 코드가 발생합니다.
이러한 각 오류는 애플리케이션의 구성 파일의 설정에 문제가 있음을 나타냅니다. 자세한 내용은 연습: Hosted Web Core에 대한 구성 파일 만들기를 참조하세요.