/ / Melhor maneira de diferenciar controladores MVC com base em cabeçalhos HTTP - .net, asp.net, asp.net-mvc, roteamento

Melhor maneira de diferenciar controladores MVC com base em cabeçalhos HTTP - .net, asp.net, asp.net-mvc, roteamento

Problema

Meu projeto atual requer 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 parao mesmo tipo de recurso), e cada método de ação tem 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 FilterAttribute personalizado (implementado quase exatamente como o AcceptVerbsAttribute na Visualização 5) que verifica se certos cabeçalhos têm determinados valores.

Eu realmente gostaria de enviar o código para controladores separados e fazer com que o RouteTable selecione 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 uma das seguintes maneiras:

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

  2. O cliente deseja uma página html, então passa "aceitar: texto / html", o site envia de volta uma página html formatada em tabela listando os arquivos.

Respostas:

4 para resposta № 1

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 é omesmo, mas a única diferença é como você renderiza a resposta ao usuário, você pode considerar escrever um ActionResult customizado que executa ações diferentes com base nos cabeçalhos Http.

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


0 para resposta № 2

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


0 para resposta № 3

Não tenho certeza se é possível, mas parece que seria algo como o atributo AcceptVerbs que era 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.


0 para a resposta № 4

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