2009-12-18 21 views
9

Me gustaría poder generar URLs desde una RouteCollection sin tener acceso al HttpContext. Al observar la forma en que se implementa RouteCollection, todos los métodos requieren acceso a RequestContext para obtener la ruta virtual.ASP.NET MVC - Generar rutas sin Http/Contexto de solicitud

He solucionado esto burlando el HttpContext pero esto agrega una dependencia incómoda a RhinoMocks y no es una solución razonable. ¿Tengo otras opciones para generar Urls fuera de contexto?

Respuesta

1

Disculpa, pero acostúmbrate a burlarte del framework MVC. Tan pronto como te metas en las pruebas, vas a necesitarlo. Hay mucho allí: HttpContext, Session, Server: todo lo que se filtra en su controlador. Si quieres generar la ruta, o necesitas hablar con HttpContext (en MVC, esto es en realidad HttpContextBase, para que puedas escribir tu propia implementación concreta, supongo), o necesitas burlarte de ella.

+1

No me opongo a las burlas para situaciones de prueba. Sin embargo, no estoy haciendo esto en una prueba. Estoy generando correos electrónicos a través de un servicio asíncrono. Como es asíncrono, no hay acceso a HttpRequest. – bromanko

+0

Es de suponer que una acción está iniciando el proceso que genera correos electrónicos. Intente realizar la llamada de enrutamiento desde dentro de la acción (cuando tenga acceso a un RequestContext), luego pase el resultado a cualquier proceso que genere los correos electrónicos. – Levi

+0

Hay casos en que los correos electrónicos se generan sin que la web los trige. Por ejemplo, correos electrónicos diarios o recordatorios. – bromanko

3

Una gran pregunta, de hecho. El enrutamiento en sí mismo tiene algunas dependencias al ser llamado desde una aplicación ASP.NET en ejecución, como obtener la URL raíz de la aplicación, así como cualquier formulario sin cookies o cookies de sesión que también entren en la URL. Si bien la creación de objetos falsos es una solución teórica, no se recomienda su uso en tiempo de ejecución.

Mi recomendación es no utilizar en absoluto el enrutamiento para esta situación y codificar las URL en los correos electrónicos. Los enlaces en un correo electrónico deben tener URL completas (nombre de host + ruta) y el enrutamiento ni siquiera puede generar el nombre de host para la URL, por lo que es algo que ya tendría que codificar.