Pergunta

Problema

Meu projeto atual exige que eu faça coisas diferentes com base em diferentes cabeçalhos de solicitação HTTP para quase todas as ações.

Atualmente, tenho um controlador enorme (todos para o mesmo tipo de recurso) e cada método de ação possui um atributo ActionName (para que eu possa ter várias versões da mesma ação que usa os mesmos parâmetros, mas faz coisas diferentes) e um customizado. FilterAttribute (implementado quase exatamente como AcceptVerbsAttribute na visualização 5) que verifica se determinados cabeçalhos possuem determinados valores.

Eu realmente gostaria de enviar o código para controladores separados e fazer com que o RouteTable selecionasse entre eles com base nos cabeçalhos, mas não consigo pensar na maneira mais limpa de fazer isso.

Exemplo

Por exemplo, digamos que eu tenha uma lista de arquivos.O serviço deve processar a solicitação de duas maneiras:

  1. O cliente deseja um arquivo zip e passa "aceitar:application/zip" como cabeçalho, pego a lista de arquivos, coloco-os em um arquivo zip e envio-o de volta ao cliente.

  2. O cliente quer uma página html, então passa "accept:text/html", o site envia de volta uma página html em formato de tabela listando os arquivos.

Foi útil?

Solução

Parece que você tem um comportamento ligeiramente diferente de suas ações com base no cabeçalho que aparece.Eu tentaria isolar as diferenças tanto quanto possível.

Por exemplo, se a lógica do aplicativo for a mesma, mas a única diferença for como você renderiza a resposta ao usuário, considere escrever um ActionResult personalizado que execute ações diferentes com base nos cabeçalhos Http.

No entanto, se a lógica for completamente diferente, você poderá implementar uma restrição de roteamento personalizada (IRoutConstraint) anexada a cada rota.Dê uma olhada na implementação de HttpMethodConstraint para ter ideias.

Outras dicas

Não tenho certeza se você precisa de controladores separados com base no cabeçalho;esta estrutura parece perfeitamente razoável.Se o seu controlador for enorme, como você diz, considere se ele está lidando com vários recursos e, se for, talvez deva ser dividido em vários controladores com base no recurso.

Não tenho certeza se é possível, mas parece que seria algo parecido com o atributo AcceptVerbs que foi adicionado na visualização 5.Eu daria uma olhada em como isso foi implementado (obtenha a fonte MVC) para ver se você pode adicionar algo semelhante com base no tipo de conteúdo.

Você deveria olhar esta postagem.Ele descreve a implementação de respostas json e xml com base no cabeçalho http.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top