Серверные приложения

можно создавать на различных языках программирования, таких как C++ или С#. При формировании серверного приложения в Visual Studio .NET следует при создании нового проекта выбрать соответствующий шаблон, например  MFC ISAPI Extension Dll.

Библиотека MFC предоставляет ряд классов, поддерживающих работу с HTTP-запросами:

§  CHtmlStream;

§  CHttpServerContext;

§  CHttpServer;

§  CHttpFilterContext;

§  CHttpFilter;

§  CHttpArgList.

ISAPI-приложение создается как DLL-библиотека.

Класс, выполняющий обработку HTTP-запроса, формирует динамическую HTML-страницу. Этот класс наследуется от класса CHttpServer.

Для того чтобы добавить функции, используемые для обработки запросов, следует:

1.    Создать функцию для каждой команды. При вызове такой функции в качестве параметра ей передается объект типа CHttpServerContext.

2.    Указать для каждой команды вход в таблице обработки команд.

3.    При необходимости для реализации собственной обработки запроса надо переопределить метод CHttpExtensionProc.

 

Для таблицы описания команд в MFC-библиотеку включены пять следующих макросов:

§  BEGIN_PARSE_MAP – определяет начало таблицы описания команд и указывает класс функций членов и базовый класс;

§  END_PARSE_MAP – определяет конец таблицы описания команд;

§  ON_PARSE_COMMAND – идентифицирует команду и указывает соответствующую ей функцию;

§  ON_PARSE_COMMAND_PARAMS – определяет список параметров обрабатываемой команды. Этот макрос должен следовать непосредственно за макросом ON_PARSE_COMMAND;

§  DEFAULT_PARSE_COMMAND – определяет команду, используемую в том случае, если нет явного указания выполняемой команды.

Макрос ON_PARSE_COMMAND используется при определении команды для объекта класса CHttpServer (или наследуемого от него), поступающей от клиента, и имеет следующее описание:

ON_PARSE_COMMAND(FnName, mapClass, Args)

Параметры:

FnName – имя функции члена класса, а также и имя команды.

mapClass – имя класса указанной функции.

Args – указывает тип списка параметров и может принимать следующие значения:

ITS_EMPTY

– параметров нет;

ITS_PSTR

– указатель на строку;

ITS_RAW

– данные предварительно необрабатываемые;

Используется в том случае, если список параметров HTTP-запроса может иметь различное число параметров;

ITS_I2

– значение типа short;

ITS_I4

– значение типа long;

ITS_R4

– значение типа float;

ITS_R8

– значение типа double;

ITS_I8

– значение типа 64-битовое integer;

ITS_ARGLIST

– указатель на объект типа CHttpArgList.

 

Для запросов типа    http://LOCALSERVER/ISAPI_2.dll?Myfunc&s1=10&s2=35&c1=y

можно использовать макрос с типом параметров ITS_ARGLIST:

ON_PARSE_COMMAND(Myfunc, CMyHttpServer,       ITS_ARGLIST).

Далее для разбора такого списка параметром используется класс CHttpArgList. Этот класс представляет собой массив структур типа CHttpArg. Данные в этом случае доступны через объект CHttpArg. Поле CHttpArg::m_pstrValue содержит значение параметра, а поле CHttpArg::m_pstrArg – имя параметра.

Например, для строки

 http://localserver/myh1.dll&Arg1=str 1&Arg2&Arg3=str 2

надо реализовать разбор параметров по следующей схеме:

 

CHttpArgList

| GetFirstArg()

|—————-a

| GetNextArg()

|

|

CHttpArg

m_pstrArg="Arg1"

m_pstrValue="str 1"

m_pstrRaw="Arg1 = str 1"

 

 

| GetNextArg()

| —————-a

|

|

|

CHttpArg

m_pstrArg="Arg2"

m_pstrValue=""

m_pstrRaw="Arg2"

 

 

| GetNextArg()

|—————a

CHttpArg

m_pstrArg="Arg3"

m_pstrValue="str 3"

m_pstrRaw="Arg3 = str 3"

 

 

Для выполнения ISAPI-приложения разработанную DLL-библиотеку следует поместить в каталог WEB-сервера.

 

В следующем листинге приведен код заголовочного файла и файла реализации класса ISAPI-приложения наследуемого от CHttpServer. В автоматически сформированный код ISAPI-приложения внесены изменения, добавляющие с создаваемую HTML-страницу две строки текста и форму, содержащую элемент управления.

// Заголовочный файл MyISAPI_1.h

#pragma once

#include "resource.h"

class CMyISAPI_1Extension : public CHttpServer

{

public:

            CMyISAPI_1Extension();    // Конструктор

            ~CMyISAPI_1Extension();

public:

            virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer);

            virtual BOOL TerminateExtension(DWORD dwFlags);

            void Default(CHttpServerContext* pCtxt);

            DECLARE_PARSE_MAP()

};

// Файл реализации MyISAPI_1.cpp

#include "stdafx.h"

#include "MyISAPI_1.h"

CWinApp theApp;    // Объект приложение

BEGIN_PARSE_MAP(CMyISAPI_1Extension, CHttpServer)   // Таблица

                                                                                  // обработки команды

            // TODO: место для определения ON_PARSE_COMMAND() и

            // ON_PARSE_COMMAND_PARAMS()

            ON_PARSE_COMMAND(Default, CMyISAPI_1Extension,

                                                        ITS_EMPTY)

            DEFAULT_PARSE_COMMAND(Default, CMyISAPI_1Extension)

END_PARSE_MAP(CMyISAPI_1Extension)

CMyISAPI_1Extension theExtension;    // Только один объект

                                                                //ISAPI-расширение класса,

                                                                 // наследуемого от  CHttpServer

CMyISAPI_1Extension::CMyISAPI_1Extension(){   }     // Конструктор

CMyISAPI_1Extension::~CMyISAPI_1Extension() {   }

BOOL CMyISAPI_1Extension::GetExtensionVersion(HSE_VERSION_INFO* pVer)

{          // Вызов метода базового класса

            CHttpServer::GetExtensionVersion(pVer);

            // Загрузка строки описания

            TCHAR sz[HSE_MAX_EXT_DLL_NAME_LEN+1];

    ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),         // Макро – если 0,

    IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN));  // то завершение

            _tcscpy(pVer->lpszExtensionDesc, sz);            

            return TRUE;

}

BOOL CMyISAPI_1Extension::TerminateExtension(DWORD dwFlags)

{ // Метод класса CHttpServer – позволяет выполнить завершение

                        // потоков и работы ISAPI-расширения

                        //TODO: Clean up any per-instance resources

            return TRUE;

}

// CMyISAPI_1Extension : методы обработчики

// Код формируемой HTML-страницы записывается методом Default

// в поток вывода

void CMyISAPI_1Extension::Default(CHttpServerContext* pCtxt)

{

            StartContent(pCtxt);   // Начало HTML-страницы

            WriteTitle(pCtxt);     // Формирование значения тега TITLE

                                // _T – для Unocode конвертируется в L

            *pCtxt << _T(" HTML-page from ");  // Первая строка HTML-страницы

            *pCtxt << _T("ISAPI-application ");

             // Формирование строки HTML-документа для отображения формы

*pCtxt << _T("<FORM> <INPUT TYPE=’text’ SISE=20 </FORM>");

            EndContent(pCtxt);   // Завершение HTML-страницы

}

// Следующие строки вставляются мастером ISAPI Extension Wizard

// только на тот случай, если ISAPI-расширение не будет

// использовать MFC-бибиотеку.

// В притивном случае эти строки можно удалить

/****

static HINSTANCE g_hInstance;

HINSTANCE AFXISAPI AfxGetResourceHandle()

{          return g_hInstance;}

BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason,   // Точка

                                   LPVOID lpReserved)                          // входа в DLL-модуль

{

            if (ulReason == DLL_PROCESS_ATTACH)

            {                      g_hInstance = hInst;  }

            return TRUE;

}

****/

 

Для того чтобы добавить функции, используемые для обработки запросов, выполните следующие действия:

  1. Создайте функцию для каждой команды. При вызове такой функции в качестве параметра ей передается объект типа CHttpServerContext.
  2. Укажите для каждой команду вход в таблице обработки команд.
  3. При необходимости для реализации собственной обработки запроса переопределите метод CHttpExtensionProc.

 

Выполнение ISAPI-приложения

Для выполнения ISAPI-приложения соответствующую DLL-библиотеку следует поместить в каталог WEB-сервера. Таким сервером может быть Internet Information Server или любой другой WEB-сервер.

Для того чтобы из каталога IIS Web-сервера можно было загружать как HTML-файлы, так и DLL-файлы, значение поля Executable Permissions должно быть установлено равным Script and Executables.

После размещения ISAPI-приложения в домашнем каталоге WEB-сервера, это приложение можно выполнить в WEB-броузере, указав соответствующий URL-адрес.

При выполнении приложения на локальном компьютере в качестве имени сервера указывается localhost.

Например: http://localhost/MyISAPI_4.dll.

При размещении ISAPI-приложения на WEB-сервере имя приложения можно изменить. При первом выполнения ISAPI-приложения сервер загружает данную DLL. При всех последующих вызовах обращение происходит к уже загруженной DLL.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100