Ciclo de vida da requisição
Esta página foi traduzida automaticamente do inglês. Ler o original
Abaixo é explicado todo o ciclo de vida de uma requisição por meio de um exemplo de requisição HTTP.
- Recebendo a requisição: cada requisição cria um contexto HTTP entre a própria requisição e a resposta que será entregue ao cliente. Esse contexto provém do listener interno do Sisk, que pode ser o HttpListener, Kestrel ou Cadente.
- Validação de requisição externa: a validação de HttpServerConfiguration.RemoteRequestsAction é validada para a requisição.
- Se a requisição for externa e a propriedade for
Drop, a conexão é fechada sem resposta ao cliente com umHttpServerExecutionStatus = RemoteRequestDropped.
- Se a requisição for externa e a propriedade for
- Configuração do Forwarding Resolver: se um ForwardingResolver estiver configurado, ele chamará o método OnResolveRequestHost no host original da requisição.
- Correspondência de DNS: com o host resolvido e com mais de um ListeningHost configurado, o servidor buscará o host correspondente para a requisição.
- Se nenhum ListeningHost corresponder, uma resposta 400 Bad Request é retornada ao cliente e um status
HttpServerExecutionStatus = DnsUnknownHosté retornado ao contexto HTTP. - Se um ListeningHost corresponder, mas seu Router ainda não estiver inicializado, uma resposta 503 Service Unavailable é retornada ao cliente e um status
HttpServerExecutionStatus = ListeningHostNotReadyé retornado ao contexto HTTP.
- Se nenhum ListeningHost corresponder, uma resposta 400 Bad Request é retornada ao cliente e um status
- Vinculação do router: o router do ListeningHost correspondente é associado ao servidor HTTP recebido.
- Se o router já estiver associado a outro servidor HTTP, o que não é permitido porque o router usa ativamente os recursos de configuração do servidor, uma
InvalidOperationExceptioné lançada. Isso ocorre apenas durante a inicialização do servidor HTTP, não durante a criação do contexto HTTP.
- Se o router já estiver associado a outro servidor HTTP, o que não é permitido porque o router usa ativamente os recursos de configuração do servidor, uma
- Pré-definição de cabeçalhos:
- Predefine o cabeçalho
X-Request-Idna resposta se estiver configurado para isso. - Predefine o cabeçalho
X-Powered-Byna resposta se estiver configurado para isso.
- Predefine o cabeçalho
- Validação do tamanho do conteúdo: valida se o conteúdo da requisição é menor que HttpServerConfiguration.MaximumContentLength apenas se for maior que zero.
- Se a requisição enviar um
Content-Lengthmaior que o configurado, uma resposta 413 Payload Too Large é retornada ao cliente e um statusHttpServerExecutionStatus = ContentTooLargeé retornado ao contexto HTTP.
- Se a requisição enviar um
- O evento
OnHttpRequestOpené invocado para todos os manipuladores de servidor HTTP configurados.
- Validação de requisição externa: a validação de HttpServerConfiguration.RemoteRequestsAction é validada para a requisição.
- Roteando a ação: o servidor invoca o router para a requisição recebida.
- Se o router não encontrar uma rota que corresponda à requisição:
- Se a propriedade Router.NotFoundErrorHandler estiver configurada, a ação é invocada, e a resposta da ação é encaminhada ao cliente HTTP.
- Se a propriedade anterior for nula, uma resposta padrão 404 Not Found é retornada ao cliente.
- Se o router encontrar uma rota correspondente, mas o método da rota não corresponder ao método da requisição:
- Se a propriedade Router.MethodNotAllowedErrorHandler estiver configurada, a ação é invocada e a resposta da ação é encaminhada ao cliente HTTP.
- Se a propriedade anterior for nula, uma resposta padrão 405 Method Not Allowed é retornada ao cliente.
- Se a requisição for do método
OPTIONS:- O router retorna uma resposta 200 Ok ao cliente somente se nenhuma rota corresponder ao método da requisição (o método da rota não for explicitamente RouteMethod.Options).
- Se a propriedade HttpServerConfiguration.ForceTrailingSlash estiver habilitada, a rota correspondida não for uma expressão regular, o caminho da requisição não terminar com
/, e o método da requisição forGET:- Uma resposta HTTP 307 Temporary Redirect com o cabeçalho
Locationcontendo o caminho e a query para o mesmo local com um/ao final é retornada ao cliente.
- Uma resposta HTTP 307 Temporary Redirect com o cabeçalho
- O evento
OnContextBagCreatedé invocado para todos os manipuladores de servidor HTTP configurados. - Todas as instâncias globais de IRequestHandler com a flag
BeforeResponsesão executadas.- Se algum manipulador retornar uma resposta não nula, essa resposta é encaminhada ao cliente HTTP e o contexto é fechado.
- Se um erro for lançado nesta etapa e HttpServerConfiguration.ThrowExceptions estiver desabilitado:
- Se a propriedade Router.CallbackErrorHandler estiver habilitada, ela é invocada e a resposta resultante é retornada ao cliente.
- Se a propriedade anterior não estiver definida, uma resposta vazia é retornada ao servidor, que encaminha uma resposta de acordo com o tipo de exceção lançada, que normalmente é 500 Internal Server Error.
- Todas as instâncias de IRequestHandler definidas na rota e com a flag
BeforeResponsesão executadas.- Se algum manipulador retornar uma resposta não nula, essa resposta é encaminhada ao cliente HTTP e o contexto é fechado.
- Se um erro for lançado nesta etapa e HttpServerConfiguration.ThrowExceptions estiver desabilitado:
- Se a propriedade Router.CallbackErrorHandler estiver habilitada, ela é invocada e a resposta resultante é retornada ao cliente.
- Se a propriedade anterior não estiver definida, uma resposta vazia é retornada ao servidor, que encaminha uma resposta de acordo com o tipo de exceção lançada, que normalmente é 500 Internal Server Error.
- A ação do router é invocada e transformada em uma resposta HTTP.
- Se um erro for lançado nesta etapa e HttpServerConfiguration.ThrowExceptions estiver desabilitado:
- Se a propriedade Router.CallbackErrorHandler estiver habilitada, ela é invocada e a resposta resultante é retornada ao cliente.
- Se a propriedade anterior não estiver definida, uma resposta vazia é retornada ao servidor, que encaminha uma resposta de acordo com o tipo de exceção lançada, que normalmente é 500 Internal Server Error.
- Se um erro for lançado nesta etapa e HttpServerConfiguration.ThrowExceptions estiver desabilitado:
- Todas as instâncias globais de IRequestHandler com a flag
AfterResponsesão executadas.- Se algum manipulador retornar uma resposta não nula, a resposta do manipulador substitui a resposta anterior e é imediatamente encaminhada ao cliente HTTP.
- Se um erro for lançado nesta etapa e HttpServerConfiguration.ThrowExceptions estiver desabilitado:
- Se a propriedade Router.CallbackErrorHandler estiver habilitada, ela é invocada e a resposta resultante é retornada ao cliente.
- Se a propriedade anterior não estiver definida, uma resposta vazia é retornada ao servidor, que encaminha uma resposta de acordo com o tipo de exceção lançada, que normalmente é 500 Internal Server Error.
- Todas as instâncias de IRequestHandler definidas na rota e com a flag
AfterResponsesão executadas.- Se algum manipulador retornar uma resposta não nula, a resposta do manipulador substitui a resposta anterior e é imediatamente encaminhada ao cliente HTTP.
- Se um erro for lançado nesta etapa e HttpServerConfiguration.ThrowExceptions estiver desabilitado:
- Se a propriedade Router.CallbackErrorHandler estiver habilitada, ela é invocada e a resposta resultante é retornada ao cliente.
- Se a propriedade anterior não estiver definida, uma resposta vazia é retornada ao servidor, que encaminha uma resposta de acordo com o tipo de exceção lançada, que normalmente é 500 Internal Server Error.
- Se o router não encontrar uma rota que corresponda à requisição:
- Processando a resposta: com a resposta pronta, o servidor a prepara para envio ao cliente.
- Os cabeçalhos da Política de Compartilhamento de Recursos entre Origens (CORS) são definidos na resposta de acordo com o que foi configurado no atual ListeningHost.CrossOriginResourceSharingPolicy.
- O código de status e os cabeçalhos da resposta são enviados ao cliente.
- O conteúdo da resposta é enviado ao cliente:
- Se o conteúdo da resposta for descendente de ByteArrayContent, os bytes da resposta são copiados diretamente para o fluxo de saída da resposta.
- Se a condição anterior não for atendida, a resposta é serializada para um fluxo e copiada para o fluxo de saída da resposta.
- Os fluxos são fechados e o conteúdo da resposta é descartado.
- Se HttpServerConfiguration.DisposeDisposableContextValues estiver habilitado, todos os objetos definidos no contexto da requisição que herdam de IDisposable são descartados.
- O evento
OnHttpRequestCloseé invocado para todos os manipuladores de servidor HTTP configurados. - Se uma exceção foi lançada no servidor, o evento
OnExceptioné invocado para todos os manipuladores de servidor HTTP configurados. - Se a rota permitir registro de acesso e HttpServerConfiguration.AccessLogsStream não for nulo, uma linha de log é escrita na saída de log.
- Se a rota permitir registro de erros, houver uma exceção, e HttpServerConfiguration.ErrorsLogsStream não for nulo, uma linha de log é escrita na saída de log de erros.
- Se o servidor estiver aguardando uma requisição através de HttpServer.WaitNext, o mutex é liberado e o contexto fica disponível para o usuário.