Pregunta

Problema

Mi proyecto actual requiere que haga cosas diferentes según diferentes encabezados de solicitud HTTP para casi cada acción.

Actualmente, tengo un controlador masivo (todos para el mismo tipo de recurso) y cada método de acción tiene un atributo ActionName (para poder tener múltiples versiones de la misma acción que toma los mismos parámetros, pero hace cosas diferentes) y un controlador personalizado. FilterAttribute (implementado casi exactamente como AcceptVerbsAttribute en la Vista previa 5) que verifica si ciertos encabezados tienen ciertos valores.

Realmente me gustaría insertar el código en controladores separados y hacer que RouteTable seleccione entre ellos según los encabezados, pero no puedo pensar en la forma más limpia de hacerlo.

Ejemplo

Por ejemplo, digamos que tengo una lista de archivos.El servicio debe procesar la solicitud de una de dos maneras:

  1. El cliente quiere un archivo zip y pasa "aceptar:application/zip" como encabezado, tomo la lista de archivos, los empaqueto en un archivo zip y lo envío de regreso al cliente.

  2. El cliente quiere una página html, por lo que pasa "aceptar:text/html", el sitio devuelve una página html con formato de tabla que enumera los archivos.

¿Fue útil?

Solución

Parece que tiene un comportamiento ligeramente diferente al de sus acciones según el encabezado que aparece.Intentaría aislar las diferencias tanto como sea posible.

Por ejemplo, si la lógica de la aplicación es la misma, pero la única diferencia es cómo presenta la respuesta al usuario, podría considerar escribir un ActionResult personalizado que realice diferentes acciones según los encabezados Http.

Sin embargo, si la lógica es completamente diferente, puede implementar una restricción de enrutamiento personalizada (IRoutConstraint) que adjunta a cada ruta.Eche un vistazo a la implementación de HttpMethodConstraint para obtener ideas.

Otros consejos

No estoy seguro de que necesite controladores separados según el encabezado;Esta estructura suena perfectamente razonable.Si su controlador es enorme como usted dice, considere si se trata de múltiples recursos y, si es así, ¿quizás debería dividirse en múltiples controladores según el recurso?

No estoy seguro de si es posible, pero parece que sería algo así como el atributo AcceptVerbs que estaba añadido en la Vista previa 5.Echaría un vistazo a cómo se implementó (obtenga la fuente MVC) para ver si puede agregar algo similar según el tipo de contenido.

Deberías mirar esta publicación.Describe la implementación de respuestas json y xml basadas en el encabezado http.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top