Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

Server.Transfer é limitado?

Eu estou trabalhando em um projeto ASP.NET e estou criando um handler, que obviamente implementa a Interface IHttpHandler, para que processe e gere um arquivo binário para forçar o download do mesmo.

Depois que configurei o arquivo Web.Config, a requisição para arquivos com extensão "*.abc" serão agora interceptados por este handler. Mas existe um grande problema aqui, porque eu estou utilizando o método Server.Transfer, então eu não posso enviar para um dos overloads deste método uma instancia deste handler que criei ou chamar diretamente o "caminho virtual", como "Pagina.abc". Voce pode confirmar essa informação decompilando o método Transfer utilizando o Reflector:

[ --- Suprimido --- ]
else if (!(handler is Page))
{
   error = new HttpException(0x194, string.Empty);
}
[ --- Suprimido --- ]
if (error != null)
{
   [ --- Suprimido --- ]
   throw new HttpException(SR.GetString("Error_executing_child_request_for_handler",
      new object[] { handler.GetType().ToString() }), error);
}

Independentemente do overload do método Transfer que voce use, a mensagem de erro é a mesma: "Error executing child request for [handler | Pagina.abc].". A razão porque eu não utilizo o método Response.Redirect é que eu preciso enviar parametros através do coleção de Context.Items por questões de segurança.

A solução temporária para isso é herdar a classe Page ao invés de implementar a interface IHttpHandler no meu handler, mas eu acredito que isso não seja lá muito elegante.

posted on Thursday, July 27, 2006 1:38 AM

Feedback

# re: Server.Transfer é limitado? 7/27/2006 2:14 PM António Cruz

Israel,

Não sei se percebi o cenário que descreveste: era mais fácil se nos desses o essencial do handler para analisarmos...? De qualquer modo, aqui fica uma possível solução *sem* usares o Server.Transfer:

1) Podes chamar o ficheiro virtual directamente desde que faças um HttpContext.RewritePath para uma qualquer path física no handler, de modo a fazeres bypass a essa verificação do IIS (no entanto, se houverem directórios na path solicitada estes directórios têm que ser físicos, mas podes contornar até esta questão dos directórios fazendo um ISAPI filter simples);

2) Processas e fazes Response.OutputStream do binário que geraste.

Cumprimentos,

António Cruz

# re: Server.Transfer é limitado? 7/27/2006 6:36 PM Israel Aece

Olá Antonio,

Obrigado pelo retorno. Pois bem, eu não pensei na possibilidade de utilizar o RewritePath.

De qualquer forma eu não gosto muito da idéia de ter que criar algo fisíco se tenho toda a minha regra dentro de um handler que expõe o conteúdo para download através do método Response.BinaryWrite.

Mas com a sua recomendação, é bem possível que o RewritePath não precise do arquivo fisico, um exemplo disso é este blog.

Title  
Name  
Url
Box Code
Protected by FormShield
Comments