Cómo implementar subprocesos de trabajo utilizando la extensión ISAPI MFC

Seleccione idioma Seleccione idioma
Id. de artículo: 185518 - Ver los productos a los que se aplica este artículo
Recomendamos encarecidamente que todos los usuarios actualizar a Microsoft Internet Information Services (IIS) versión 7.0 que se ejecutan en Microsoft Windows Server 2008. IIS 7.0 aumenta notablemente la seguridad de la infraestructura Web. Para obtener más información acerca de temas relacionados con la seguridad IIS, visite el siguiente sitio Web de Microsoft:
http://www.microsoft.com/technet/security/prodtech/IIS.mspx
Para obtener más información acerca de IIS 7.0, visite el siguiente sitio Web de Microsoft:
http://www.iis.net/default.aspx?tabid=1
Expandir todo | Contraer todo

En esta página

Resumen

Un método de implementación de una extensión ISAPI que potencialmente puede requerir un procesamiento largo tiempo (si está esperando en consultas de base de datos o esperando a otras conexiones de red) consiste en implementar un modelo de subproceso de trabajo. Esto garantiza que el subproceso de cola de subprocesos asincrónica (ATQ) de IIS no está ocupado durante largos períodos. Aunque un ejemplo de implementación de subprocesos de trabajo dentro de una extensión ISAPI se distribuye con platform SDK, no es tan sencilla implementar un esquema similar mediante una extensión generado por el Asistente para ISAPI de basada en MFC. En este artículo se muestra cómo incorporar subprocesos dentro de una extensión de MFC.

Más información

Hay varios pasos implicados en la implementación de subprocesos dentro de una extensión basado en MFC. El primer paso es reemplazar el método virtual HttpExtensionProc() encuentra en la clase base de CHttpServer. Esto es muy sencillo. El código de ejemplo siguiente se supone que se ha creado un proyecto de Asistente para extensiones ISAPI denominado MyApp:

  1. En MyApp.h, reemplazar HttpExtensionProc():
          class CMyAppExtension : public CHttpServer
          {
          public:
    
          // Code generated by the ClassWizard.
    
          // Simply include the method in the public section of the code
          // generated by the ClassWizard making certain not to alter
          // anything else.
             virtual DWORD HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB);
          };
    					
  2. De MyApp.cpp, reemplace la clase base HttpExtensionProc(). Lea algo así:
          DWORD CMyAppExtension::HttpExtensionProc( EXTENSION_CONTROL_BLOCK
                                                    *pECB)
          {
    
          // The result of the base class's (CHttpServer) HttpExtensionProc()
          // must be checked.  If it's successful, you will need to return a
          // HSE_STATUS_PENDING.  This is so that IIS will not shutdown the
          // connection and not destroy the ECB.
          // If the result of the base class is not successful, you should
          // simply propagate the error message up to IIS.
    
             DWORD  dwResult = CHttpServer::HttpExtensionProc(pECB);
             if(dwResult == HSE_STATUS_SUCCESS)
               return HSE_STATUS_PENDING;
             else
               return dwResult;
          }
    					
  3. Ahora, dentro de la función de mapa de análisis (aquí, supongo que simplemente utiliza la función predeterminada insertada para nosotros por el Asistente para clases--el método no toma variable, excepto el CHttpServerContext y no devuelve nada):
          void CMyAppExtension::Default(CHttpServerContext* pCtxt)
          {
          // Setting the m_bSendHeaders variable to FALSE will prevent
          // IIS from sending headers; this must be handled by your
          // thread.
    
             pCtxt->m_bSendHeaders = FALSE;
    
          // Spawn thread...you must use AfxBeginThread since this is an MFC
          // based extension.
             AfxBeginThread((AFX_THREADPROC)MyThreadProc,
                            (LPVOID)(pCtxt->m_pECB));
          }
    						
    si utilizan alguna otra función que toma varios parámetros, debe crear su propia class/struct para encapsular el puntero ECB y los parámetros y pasar un puntero a esa clase para el proceso de subproceso (simplemente Asegúrese de que limpiar la estructura de clase).
  4. En el proceso de subproceso:
          UINT MyThreadProc(LPVOID pvParam)
          {
             EXTENSION_CONTROL_BLOCK *pECB = (EXTENSION_CONTROL_BLOCK*)pvParam;
    
          // Do some processing here...
    
          // To send custom headers, remember to set the m_bSendHeaders to
          // FALSE in the CHttpServerContext from the method that spawned
          // this thread and use the ServerSupportFunction().
    
          // Write data to the client...
          // pECB->WriteClient(...);
    
          // Before returning from the thread routine, you must send the
          // HSE_REQ_DONE_WITH_SESSION flag so IIS can clean up the session.
             pECB->ServerSupportFunction(pECB->ConnID,
                                         HSE_REQ_DONE_WITH_SESSION,
                                         NULL, NULL, 0);
    
             return 0;
          }
    					

Ejemplo completado

Los archivos siguientes están disponibles para descargarlos del Centro de descarga de Microsoft:
MFCWkThr.exe
Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a impedir la realización de cambios no autorizados. Para generar el ejemplo, primero extraer los archivos en un directorio y abra el proyecto en Microsoft Visual C++.

Nota: En este ejemplo se utiliza un subproceso de trabajo por sesión. Un modelo más sofisticado y eficaz utilizaría un grupo de subprocesos de trabajo y un mecanismo de cola para controlar los ECB de varios. <machinename>Recuerde también que, que mientras el subproceso ATQ está suplantando la cuenta IUSR_ <nombremáquina> cuenta, el subproceso de trabajo recién generado ejecutará en el contexto de seguridad de la cuenta sistema local. <machinename>Para cambiar a la cuenta IUSR_ <nombremáquina> cuenta, guardar el token de seguridad de subprocesos en el subproceso ATQ llamando OpenThreadToken() y pasar ese testigo junto con el ECB al subproceso de trabajo y tener el subproceso de trabajo llamada SetThreadToken().

Advertencia: El ejemplo anterior se supone que todas las funciones en el mapa de análisis va a utilizar el modelo de subproceso de trabajo. Si cualquier función no utiliza un subproceso de trabajo, debe notificar CMyAppExtension::HttpExtensionProc() para no enviar vuelve HSE_STATUS_PENDING. La solución más sencilla es forzar todas las funciones de mapa de análisis utilizar subprocesos de trabajo. Si no es una solución aceptable, una forma para notificar el HttpExtensionProc() sería utilizar almacenamiento local de subprocesos. Si no se tiene cuidado para garantizar que el indicador de retorno correcto se envía por la HttpExtensionProc(), puede hacer potencialmente las sesiones huérfanas.

Referencias

Para obtener información adicional, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
197728Crear un grupo de subprocesos para extensiones ISAPI basada en MFC


Vea almacenamiento local de subprocesos en la documentación de API de Win32.

Propiedades

Id. de artículo: 185518 - Última revisión: jueves, 3 de julio de 2008 - Versión: 4.1
La información de este artículo se refiere a:
  • Servicios de Microsoft Internet Information Server 3.0
  • Microsoft Internet Information Server 4.0
  • Microsoft Internet Information Services 5.0
  • Microsoft Internet Information Services version 5.1
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Internet Server Application Programming Interface 4.0
Palabras clave: 
kbmt kbdownload kbfilter kbhowto kbhttp KB185518 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 185518

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com