Servindo arquivos dinâmicos com Blazor em ASP.NET

Conteúdo

Um dos muitos recursos excelentes de quadros como Blazor e ASP.NET (em que funciona) é a capacidade de fornecer conteúdo dinâmico para qualquer endpoint que seu aplicativo precise. Se você deseja servir downloads de arquivos gerados, é fácil de fazer com um pouco de configuração.

Por que servir arquivos dinâmicos?

Simplesmente, você tem duas opções como servidor web: responder a uma solicitação com conteúdo estático, como uma página HTML ou um arquivo JPG, ou gere uma resposta personalizada para enviar ao usuário. Blazor roda em ASP.NET, portanto, o servidor HTTP embutido suporta uma ampla gama de alternativas e permite grande flexibilidade.

Como um exemplo, talvez você queira hospedar um arquivo JSON em /images/pathname.json. Não precisa ser um arquivo literal no disco; o servidor pode interpretar esta solicitação e responder com qualquer tipo de conteúdo, incluiu algo inesperado como um arquivo PNG. Você pode responder a esta solicitação obtendo alguns resultados de uma API, criar uma resposta e enviar a string de volta ao usuário.

Ou talvez você queira gerar o arquivo real na hora. Como um exemplo, existem muitas bibliotecas gráficas usadas para desenhar imagens personalizadas. Você pode usar um deles para gerar uma imagem e responder à solicitação do usuário com os dados, tudo na memória.

No último caso, pode fazer sentido armazenar a solução em cache, salvando-a no disco e respondendo com um arquivo real na maioria das vezes. Isso pode ser útil para gerações de arquivos que consomem muitos recursos e não são alterados com tanta frequência..

Configurar

Serviço de arquivo como este é integrado e bastante simples de fazer. Você precisará criar uma nova página do Razor, que é o que Blazor Executa em. Você pode fazer isso clicando com o botão direito no Visual Studio e selecionando Adicionar> Razor Page.

Fazendo isso, dois arquivos são criados que estão vinculados um ao outro na hierarquia: Name.cshtml, que lida com o lado HTML das coisas, e Name.cshtml.cs, que lida com o modelo e o código real. Uma vez que esta não será uma página da web real, apenas um arquivo, você pode ignorar o primeiro na maior parte.

Apesar disto, você precisará configurar o @page atributo para corresponder onde você deseja que este arquivo seja hospedado. Você provavelmente deseja incluir alguns curingas, o que você faz com colchetes.

No Name.cshtml.cs Arquivo, você verá um código real que estende PageModel. A principal função aqui é OnGet(), que você provavelmente vai querer mudar para OnGetAsync() se você estiver fazendo algum processamento assíncrono.

Você tem três opções principais deste recurso. Primeiro, está retornando um PhysicalFile, que literalmente lê um arquivo no disco dado um caminho e o envia ao usuário com um tipo, opcionalmente com um nome de download diferente do caminho real.

Embora provavelmente esteja aqui para gerar algo dinamicamente, isso pode ser muito útil para o cache. Se sua função de renderização salva o resultado em um arquivo, você pode verificar se esse arquivo existe antes de processá-lo novamente, e se isso acontecer, apenas retorne a solução em cache.

A próxima opção é retornar um arquivo virtual, dada uma matriz de bytes. Isso é o que você deseja usar para a maioria dos aplicativos, uma vez que funciona absolutamente na memória e deve ser muito rápido.

Dependendo da codificação que você está tentando usar, você pode querer converter uma string em uma matriz de bytes usando o Encoding aula de ajudante.

Encoding.UTF8.GetBytes(fragmento);

Por último, pode retornar uma string de conteúdo diretamente, o que usar se você quiser mostrar o conteúdo ao usuário em vez de acionar um download no navegador.

Existem outras opções ao mesmo tempo dessas três, mas o resto envolve responder com códigos de status, redirecionar, respostas não autorizadas e renderizar a própria página.

Entrega de arquivo de acordo com caminhos e parâmetros

Desde já, nada disso é útil se você não puder responder às solicitações apoiadas pela entrada do usuário. As duas alternativas de entrada estão no URL: parâmetros de roteamento e parâmetros de url. Os parâmetros de roteamento são aqueles que você especificou por meio de curingas na própria página e são o caminho real para o arquivo. Os parâmetros de URL são opcionais.

Descobrir isso pode ser um pouco complicado, mas felizmente você tem um depurador ao seu lado, para que você possa determinar um ponto de interrupção em OnGetAsync() e ver toda a árvore de variáveis ​​locais.

Você encontrará, abaixo this.PageContext.RouteData, tem uma RouteValueDictionary<string, object> que armazena todas as rotas. Observe que isso inclui o caminho da própria página, então se você usou /Download/{param} como rota, o param será a segunda opção.

A melhor maneira de obter os parâmetros é pesquisá-los por chave:

Da mesma forma, parâmetros de consulta também estão disponíveis, mesmo quando de um objeto diferente. Você precisará entrar HttpContext.Request.Query, que é um QueryValueDictionary que contém os parâmetros de url, e funciona da mesma maneira que o caminho.

A seguir, você pode usar esses parâmetros para realizar pesquisas ou afetar a lógica. Apesar disto, se você estiver armazenando respostas em cache, você vai querer ter certeza de que o cache e as condições de pesquisa também são afetados por esses parâmetros, ou você pode ter problemas com comportamentos inesperados de cache.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.