|
Программирование >> Руководство по созданию web приложений
Глава/. CGI и ISAPI сервера Web Если все данные уже считаны, функцию ReaclCllent вызывать не нужно. В том когда значение, передаваемое через поле cbTotalBytes, превышает значение mailable. Вы должны воспользоваться функцией ReadClient для того чтобы прочесть ciiTotalBytea-cbaaailaDle байт . от пользователя. Заметим, что функция ReadClient не будет читать заново данные, записанные в буфер IptiData. Она займется оставшимися данными, причем не исключено, что для их прочтения эту функцию придется вызывать в несколько раз. Дело в том, что функция ReadClient не всегда может прочитать все оставшиеся данные за один прием. После успешного завершения чтения функция ReadClient записывает размер прочитанного блока данных в адрес которой . через па- раметр . . . Если а первом вызове этот размер меньше величины cbTotal-а .. : Вы должны вызвать ReadClient еще один или не- раз для чтения данных. Отправка данных расширением ISAPI того чтобы выходные данные в . . . . поток как это делает программа CGI, расширение ISAPI пользуется для пересылки данных функц1юми и Указатели на эти фун- кции передаются а .... ISAPI через структуру типа , - - :11Б10Н СС11Т- Функция WriteClient Прототип функции . .а взятый из определения структуры EXTEN- : - . . приведен ниже: BOOL ... * .. ..... С LPVOID Buffer, DWORD . Через параметр hConn функции WriteClient передается идентификатор канала, полученный через поле СоппШ структуры ~~\. Функция WriteClient удаленному пользователю данные из буфе- ра Buffer, гаааа размер передаваемого блока данных быть записан в , . : типа DWORD, . . которой передается через параметр IpdwBytes. Параметр dwReserved зарезервирован для дальнейших расширений возможнос- функции. В случае успеха функция . TRUE, а при ошибке - значе- ние EALSE. Код ошибки можно получить посредством функции QetLastErrar что после данных функция WriteClient записывает в пе- ременную, адрес которой был ей передан через параметр IpdwBytes, количество успешно . байт данных. В отличие от tjiyirKiiiiii ReadClient, функция WriteClient посылает данные за один прием, поэтому нет необходимости вызывать ее в цикле. Если же эта функция смогла передать только часть данных, то это означает, что произошла ошибка. Функция SerttrSuppirlfuictioii Прототип функции ServerSupportFunction, определенный в структуре типа . приведен ниже: BOOL (WINAPI .. - : hConn, DTORD . LPVOID LPDWORD IpdwSlze, LPDWORD strcat(szBuff, NULL. NULL. Заметим, что функция ServerSupportFunction не позволяет посылать двоичные данные. Для отправки двоичных данных Вы обязательно должны применить функцию WriteClient. Через параметр rFuni - передается идентифи- катор канала, : . через поле . структуры . : Параметр :.. . позволит задать из нескольких кодов запроса, определяющих операцию, выполняемую этой Через параметр p. iiffer передается размер буфера, который : при выполнении операции. Размер этого буфера должен быть записан в переменной типа DWORD, адрес которой передается через параметр IpdwSize. После выполнения операции передачи данных в эту переменную будет записан размер успешно переданного илфт данных. Параметр IpdwDataType для указания дополнительной строки заголовка или дополнительных данных, которые будут добавлены к заголовку, iifp.ivijiBaf,*! удаленному . Если для параметра IpdwDataType указать значение NULL (что допустимо), к заголовку будут добавлены символы конца строки Какие операциидопустимо припомощифункции8егуег8иррогГ- Function? Ниже мы привели список возможных значений параметра dwHSERRequest, определяющего код выполняемой операции. # !: :. -Эта операцзю для пересылки удаленному пользователю стан- дартного заголовка HTTP. Если надо добавить другие следует вос- пользоваться параметром IpdwDataType. В качестве дополнительного заголовка Вы можете указать любую строку, закрытую символами конца строки и двоичным нулем. Если Ваше расширение ISAPI динамически формирует документ HTML и отправляет его пользователю, то ей не нужно вызывать функцию WriteClient. Все необходимые для этого действия можно сделать средствами одной только функции Ниже мы показали фрагмент в котором эта функция используется для посылки документа HTML, ленного заранее в буфере CHAR .. . : il\r\o\r\n from ISAPI . ; Глава 7. Расширения CG! и ISAPI сервера Web 321 Используя операцию И . . ; ; расширение ISAPI может послать удаленному пользователю данные, хранящиеся по определенному адресу URL, как будто бы эти данные были . непосредственно пользова- телем по этому адресу URL. Это удобно для отправки либо динамически созданных данных, либо предварительно подготовленных данных. Адрес URL должен быть указан в виде текстовой строки, а двоичным . . через а ; ... Ip.iyffer Размер строки задают в параметре IpdwSize. Что же касается параметра IpctoDataTypo, то apai выполнении данной операции этот параметр игнорируется. I HSEREIlSEUO JBLEEDIBEuLRESP Отправка сообщения с номером 302 (URL Redirect). Адрес URL указывается аналогично тому, как это делается npvi выполнении операции НЕЕ JEQ - Преобразование логического адреса URL в физический. Адрес логического пути передается через параметр IpvBuffer. По этому же адресу записывается результат преобразования. Размер буфера при вызове функции задается, как обычно, с помощью параметра IpdwSize. После выполнения преобразования в переменную типа DWORD, адрес которой указан параметром IpdwSize, будет записана длина строки результата преобразования. ♦ H8E RE§E0iEJiITPLSE8SI0N В том случае, когда расширение ISAPI оставляет канал открытым для выпол-длительной обработки данных, этой командой сообщить серве- ру о завершении обработки. Все параметры функции а : . г tPun . при указании этой команды игнорируются. Приложение ISHELLO в качестве нашего первого расширения 1SAPI мы предлагаем приложение ISHELLO, выполняющее простейшие функции. Вызов расширения isliello.dll выполняется из формы, исходный текст которой приведен в листинге 7-9. Листинг 7-9 Вы найдете в файле cti7\ISHELLO\i8liello.html на прилагаемом к книге компакт-диске. Расширение вызывается в параметре ACTION тега аналогично тому, как это делается для программ CGI: После вызова наше . . : динамически создает . . на рис. 7-7.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |