Ciclo de vida de la solicitud
Esta página fue traducida automáticamente del inglés. Leer el original
A continuación se explica todo el ciclo de vida de una solicitud mediante un ejemplo de una petición HTTP.
- Recepción de la solicitud: cada solicitud crea un contexto HTTP entre la propia solicitud y la respuesta que se entregará al cliente. Este contexto proviene del listener incorporado en Sisk, que puede ser el HttpListener, Kestrel o Cadente.
- Validación de solicitud externa: la validación de HttpServerConfiguration.RemoteRequestsAction se valida para la solicitud.
- Si la solicitud es externa y la propiedad es
Drop, la conexión se cierra sin respuesta al cliente con unHttpServerExecutionStatus = RemoteRequestDropped.
- Si la solicitud es externa y la propiedad es
- Configuración del Resolutor de Reenvío: si se configura un ForwardingResolver, se llamará al método OnResolveRequestHost en el host original de la solicitud.
- Coincidencia DNS: con el host resuelto y con más de un ListeningHost configurado, el servidor buscará el host correspondiente para la solicitud.
- Si no coincide ningún ListeningHost, se devuelve al cliente una respuesta 400 Bad Request y al contexto HTTP se le asigna el estado
HttpServerExecutionStatus = DnsUnknownHost. - Si coincide un ListeningHost, pero su Router aún no está inicializado, se devuelve al cliente una respuesta 503 Service Unavailable y al contexto HTTP se le asigna el estado
HttpServerExecutionStatus = ListeningHostNotReady.
- Si no coincide ningún ListeningHost, se devuelve al cliente una respuesta 400 Bad Request y al contexto HTTP se le asigna el estado
- Vinculación del enrutador: el router del ListeningHost correspondiente se asocia con el servidor HTTP recibido.
- Si el router ya está asociado a otro servidor HTTP, lo cual no está permitido porque el router utiliza activamente los recursos de configuración del servidor, se lanza una
InvalidOperationException. Esto solo ocurre durante la inicialización del servidor HTTP, no durante la creación del contexto HTTP.
- Si el router ya está asociado a otro servidor HTTP, lo cual no está permitido porque el router utiliza activamente los recursos de configuración del servidor, se lanza una
- Predefinición de encabezados:
- Predefine el encabezado
X-Request-Iden la respuesta si está configurado para hacerlo. - Predefine el encabezado
X-Powered-Byen la respuesta si está configurado para hacerlo.
- Predefine el encabezado
- Validación del tamaño del contenido: valida si el contenido de la solicitud es menor que HttpServerConfiguration.MaximumContentLength (100 MB por defecto) solo si es mayor que cero.
- Si la solicitud envía un
Content-Lengthmayor que el configurado, se devuelve al cliente una respuesta 413 Payload Too Large y al contexto HTTP se le asigna el estadoHttpServerExecutionStatus = ContentTooLarge.
- Si la solicitud envía un
- El evento
OnHttpRequestOpense invoca para todos los manejadores de servidor HTTP configurados.
- Validación de solicitud externa: la validación de HttpServerConfiguration.RemoteRequestsAction se valida para la solicitud.
- Enrutamiento de la acción: el servidor invoca el router para la solicitud recibida.
- Si el router no encuentra una ruta que coincida con la solicitud:
- Si la propiedad Router.NotFoundErrorHandler está configurada, se invoca la acción y la respuesta de la acción se reenvía al cliente HTTP.
- Si la propiedad anterior es nula, se devuelve al cliente una respuesta predeterminada 404 Not Found.
- Si el router encuentra una ruta coincidente, pero el método de la ruta no coincide con el método de la solicitud:
- Si la propiedad Router.MethodNotAllowedErrorHandler está configurada, se invoca la acción y la respuesta de la acción se reenvía al cliente HTTP.
- Si la propiedad anterior es nula, se devuelve al cliente una respuesta predeterminada 405 Method Not Allowed.
- Si la solicitud es del método
OPTIONS:- El router devuelve una respuesta 200 Ok al cliente solo si ninguna ruta coincide con el método de la solicitud (el método de la ruta no está explícitamente definido como RouteMethod.Options).
- Si la propiedad HttpServerConfiguration.ForceTrailingSlash está habilitada, la ruta coincidente no es una expresión regular, la ruta de la solicitud no termina con
/y el método de la solicitud esGET:- Se devuelve al cliente una respuesta HTTP 307 Temporary Redirect con el encabezado
Locationque contiene la ruta y la cadena de consulta apuntando a la misma ubicación pero con un/al final.
- Se devuelve al cliente una respuesta HTTP 307 Temporary Redirect con el encabezado
- El evento
OnContextBagCreatedse invoca para todos los manejadores de servidor HTTP configurados. - Todas las instancias globales de IRequestHandler con la bandera
BeforeResponsese ejecutan.- Si algún manejador devuelve una respuesta no nula, esa respuesta se reenvía al cliente HTTP y el contexto se cierra.
- Si se lanza un error en este paso y HttpServerConfiguration.ThrowExceptions está deshabilitado:
- Si la propiedad Router.CallbackErrorHandler está habilitada, se invoca y la respuesta resultante se devuelve al cliente.
- Si la propiedad anterior no está definida, se devuelve al servidor una respuesta vacía, que a su vez reenvía una respuesta según el tipo de excepción lanzada, normalmente 500 Internal Server Error.
- Todas las instancias de IRequestHandler definidas en la ruta y con la bandera
BeforeResponsese ejecutan.- Si algún manejador devuelve una respuesta no nula, esa respuesta se reenvía al cliente HTTP y el contexto se cierra.
- Si se lanza un error en este paso y HttpServerConfiguration.ThrowExceptions está deshabilitado:
- Si la propiedad Router.CallbackErrorHandler está habilitada, se invoca y la respuesta resultante se devuelve al cliente.
- Si la propiedad anterior no está definida, se devuelve al servidor una respuesta vacía, que a su vez reenvía una respuesta según el tipo de excepción lanzada, normalmente 500 Internal Server Error.
- Se invoca la acción del router y se transforma en una respuesta HTTP.
- Si se lanza un error en este paso y HttpServerConfiguration.ThrowExceptions está deshabilitado:
- Si la propiedad Router.CallbackErrorHandler está habilitada, se invoca y la respuesta resultante se devuelve al cliente.
- Si la propiedad anterior no está definida, se devuelve al servidor una respuesta vacía, que a su vez reenvía una respuesta según el tipo de excepción lanzada, normalmente 500 Internal Server Error.
- Si se lanza un error en este paso y HttpServerConfiguration.ThrowExceptions está deshabilitado:
- Todas las instancias globales de IRequestHandler con la bandera
AfterResponsese ejecutan.- Si algún manejador devuelve una respuesta no nula, la respuesta del manejador reemplaza la respuesta anterior y se reenvía inmediatamente al cliente HTTP.
- Si se lanza un error en este paso y HttpServerConfiguration.ThrowExceptions está deshabilitado:
- Si la propiedad Router.CallbackErrorHandler está habilitada, se invoca y la respuesta resultante se devuelve al cliente.
- Si la propiedad anterior no está definida, se devuelve al servidor una respuesta vacía, que a su vez reenvía una respuesta según el tipo de excepción lanzada, normalmente 500 Internal Server Error.
- Todas las instancias de IRequestHandler definidas en la ruta y con la bandera
AfterResponsese ejecutan.- Si algún manejador devuelve una respuesta no nula, la respuesta del manejador reemplaza la respuesta anterior y se reenvía inmediatamente al cliente HTTP.
- Si se lanza un error en este paso y HttpServerConfiguration.ThrowExceptions está deshabilitado:
- Si la propiedad Router.CallbackErrorHandler está habilitada, se invoca y la respuesta resultante se devuelve al cliente.
- Si la propiedad anterior no está definida, se devuelve al servidor una respuesta vacía, que a su vez reenvía una respuesta según el tipo de excepción lanzada, normalmente 500 Internal Server Error.
- Si el router no encuentra una ruta que coincida con la solicitud:
- Procesamiento de la respuesta: con la respuesta lista, el servidor la prepara para enviarla al cliente.
- Los encabezados de la política Cross-Origin Resource Sharing (CORS) se definen en la respuesta según lo configurado en la actual ListeningHost.CrossOriginResourceSharingPolicy.
- El código de estado y los encabezados de la respuesta se envían al cliente.
- El contenido de la respuesta se envía al cliente:
- Si el contenido de la respuesta es una subclase de ByteArrayContent, los bytes de la respuesta se copian directamente al flujo de salida de la respuesta.
- Si la condición anterior no se cumple, la respuesta se serializa a un flujo y se copia al flujo de salida de la respuesta.
- Los flujos se cierran y el contenido de la respuesta se descarta.
- Si HttpServerConfiguration.DisposeDisposableContextValues está habilitado, todos los objetos definidos en el contexto de la solicitud que heredan de IDisposable se descartan.
- El evento
OnHttpRequestClosese invoca para todos los manejadores de servidor HTTP configurados. - Si se lanzó una excepción en el servidor, el evento
OnExceptionse invoca para todos los manejadores de servidor HTTP configurados. - Si la ruta permite el registro de accesos y HttpServerConfiguration.AccessLogsStream no es nulo, se escribe una línea de registro en la salida de logs.
- Si la ruta permite el registro de errores, hay una excepción y HttpServerConfiguration.ErrorsLogsStream no es nulo, se escribe una línea de registro en la salida de logs de errores.
- Si el servidor está esperando una solicitud a través de HttpServer.WaitNext, el mutex se libera y el contexto queda disponible para el usuario.