次の方法で共有


チュートリアル: ホストされた Web コア アプリケーションの作成

このチュートリアルでは、IIS 7 で使用できるホスト型 Web Core 機能を使用する Windows コンソール アプリケーションを作成する方法について説明します。

IIS 7 のホスト型 Web Core 機能を使用すると、IIS コアのインスタンスを読み込むアプリケーションを作成できます。これは、IIS によって提供される基本 Web アプリケーションとコンテンツ サービス機能です。 ホステッド Web Core の詳細については、「 Hosted Web Core API リファレンス」を参照してください

ApplicationHost.config ファイルの形式に従って、アプリケーションの構成ファイルを指定する必要があります。 ただし、実際のApplicationHost.config ファイルには、Web サイトの設定と競合する設定が含まれている可能性があるため、使用しないでください。 アプリケーションの構成ファイルを作成する方法の詳細については、「 チュートリアル: ホスト型 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++ プロジェクトを作成するには

  1. Visual Studio 2005 を起動します。

  2. グローバル オプションに SDK インクルード ファイルへの正しいパスがすべて含まれることを確認します。

    1. [ツール] メニューの [オプション] をクリックします。

      [オプション] ダイアログ ボックスが開きます。

    2. ツリー ビューで [ プロジェクトとソリューション] ノードを展開し、[ VC++ ディレクトリ] をクリックします。

    3. [ ディレクトリの表示対象 ] ボックスで、[ ファイルを含める] を選択します。

    4. SDK インクルード ファイルをインストールしたパスが一覧表示されていることを確認します。 パスが一覧にない場合は、[ 改行 ] アイコンをクリックし、SDK インクルード ファイルをインストールしたパスを追加します。

    5. [OK] をクリックします。

  3. 新しい C++ プロジェクトを作成します。

    1. [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。

      [新しいプロジェクト] ダイアログ ボックスが表示されます。

    2. [ プロジェクトの種類 ] ウィンドウで、[ Visual C++ ] ノードを展開し、[ Win32] をクリックします。

    3. [テンプレート] ウィンドウ 、[ Win32 プロジェクト] をクリックします。

    4. [ 名前 ] ボックスに「 HostedWebTest」と入力します。

    5. [ 場所 ] ボックスに、プロジェクトのパスを入力します。

    6. [OK] をクリックします。

      Win32 アプリケーション ウィザードが開きます。

    7. [ アプリケーションの設定] をクリックします

    8. [ アプリケーションの種類] で、[ コンソール アプリケーション] をクリックします。

    9. [完了] をクリックします。

      Visual Studio で HostWebTest.cpp プロジェクトが開きます。

  4. 呼び出し規約を使用してコンパイルするようにプロジェクトを __stdcall (/Gz) 構成します。

    1. [ プロジェクト ] メニューの [ HostedWebTest プロパティ] をクリックします。

    2. ツリー ビューで [ 構成プロパティ ] ノードを展開し、[ C/C++ ] ノードを展開して、[ 詳細設定] をクリックします。

    3. [構成] ボックスで、[すべての構成] を選択します。

    4. [ 呼び出し規約 ] ボックス で、__stdcall (/Gz) を選択します。

    5. [OK] をクリックします。

アプリケーションのコードの追加

このセクションでは、C++ ファイルに自動的に追加されたコードを、Hosted Web Core を実行するコードに置き換える方法について説明します。

注意

次の使用例は、inetsrv フォルダーで HostedWebTest.config という名前のファイルを検索します。 パスとファイル名は変更できますが、有効な構成ファイルを指定する必要があります。 アプリケーションの構成ファイルを作成する方法の詳細については、「 チュートリアル: ホスト型 Web Core 用の構成ファイルの作成」を参照してください。

アプリケーションの C++ コードを追加するには

  1. HostedWebTest.cpp ファイルがまだ開いていない場合は開き、既存の C++ コードをすべて削除します。

  2. 次の 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;
    }
    
  3. HostedWebTest.cpp ファイルを保存します。

アプリケーションのコンパイルとテスト

C++ ファイルを作成して保存した後、次の手順はアプリケーションをコンパイルしてテストすることです。

注意

IIS 7 がインストールされているコンピューターでアプリケーションをコンパイルしない場合は、アプリケーションをテストする前に、IIS 7 がインストールされているコンピューターにHostedWebTest.exe ファイルをコピーする必要があります。

アプリケーションをコンパイルしてテストするには

  1. アプリケーションをコンパイルする:

    1. [ビルド] メニューの [ソリューションのビルド] をクリックします。

    2. Visual Studio でエラーや警告が返されなかったことを確認します。 エラーまたは警告が表示された場合は、プロジェクトをテストする前に、これらの問題を解決する必要があります。

  2. Windows エクスプローラーを開き、C++ プロジェクトの作成時に指定したフォルダーを見つけます。

    ビルド オプションに応じて、プロジェクトの既定のフォルダーに Debug または Release という名前のフォルダーが表示されます。

  3. [デバッグ] フォルダーまたは [リリース] フォルダー内で、HostedWebTest.exe という名前のファイルを見つけます。

  4. 構成ファイルがアプリケーションの適切なフォルダーにあることを確認します。 たとえば、このチュートリアルで前述したコード例は、Inetsrv フォルダーにある HostedWebTest.config という名前のファイルを使用するように設計されています。

  5. コマンド プロンプト ウィンドウを開き、HostedWebTest.exe ファイルがあるパスにディレクトリを変更します。

  6. 「HostedWebTest」と入力し、Enter キーを押してアプリケーションを起動します。

  7. 次のようなアプリケーションからの出力が表示されます。

    DLL loaded successfully.
    WebCoreActivate successfully resolved.
    WebCoreShutdown successfully resolved.
    Activating the Web core...
    WebCoreActivate was successful.
    Press any key to continue...
    
  8. キーボードのキーを押さずにコマンド プロンプト ウィンドウを最小化します。

  9. 構成設定に応じて、Web ブラウザーを開き、構成ファイルで定義されている Web サイトを参照できます。

  10. Web サイトの参照が完了したら、コマンド プロンプト ウィンドウに戻り、SPACE キーを押します。

  11. 次のようなアプリケーションからの出力が表示されます。

    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状態です。 このエラーは、構成ファイルが読み込まれたが、重複する情報が含まれていることを示します。 たとえば、複数のアプリケーション プールを定義した場合や、重複する Web サイト バインドを作成した可能性があります。 Windows イベント ビューアーで追加のエラーの説明を確認する必要があります。

  • アプリケーションが正常に読み込まれたが、アプリケーションでホストされている Web サイトを参照するときに HTTP 404 エラーが発生する場合は、アプリケーションによって作成された IIS ログで 404 サブステータス コードを確認する必要があります。 表示されるサブステータス コードの一部を次に示します。

    • 404.3 "Mime Map によって拒否されました" - このサブステータス コードは、要求されたリソースの MIME の種類が正しく構成されていないことを示します。 たとえば、このコードは、.txtファイル名拡張子を持つファイルを参照し、その拡張子を構成ファイルの MIME マップに追加していない場合に発生します。

    • 404.4 "ハンドラーなし" - このサブステータス コードは、要求されたリソースに対してハンドラーが構成されていないことを示します。 たとえば、このコードは、.htmファイル名拡張子を持つファイルを参照し、静的ファイル ハンドラーを構成ファイルに追加していない場合に発生します。

    • 404.7 "ファイル拡張子が拒否されました" - このサブステータス コードは、ファイル名拡張子が要求フィルター処理によってブロックされたことを示します。 たとえば、このコードは、.gifファイル名拡張子を持つファイルを参照し、その拡張子を持つファイルへのアクセスを拒否するように要求フィルター処理が構成されている場合に発生します。

      これらのエラーはそれぞれ、アプリケーションの構成ファイルの設定に問題があることを示しています。 詳細については、「 Walkthrough: Creating a Configuration File for Hosted Web Core」を参照してください。

関連項目