Создание URL-адреса независимо от контроллеров в ASP.NET MVC 3

У меня есть приложение mvc 3 с фоновым потоком, проверяющим состояние некоторых элементов базы данных. Когда он находит просроченный товар, он отправляет электронное письмо. В электронном письме я хотел бы указать URL-адрес действия, которое нужно вызвать, чтобы увидеть статус. Если бы это было сделано с контроллера, я бы использовал UrlHelper, например:

string body_url = "For more details see: " + Url.Action("Details", "MyOrder", new { OrderId = order.OrderId }, Constants.HttpProtocol);

Однако я не нахожусь в контроллере, и мой метод не вызывается из контроллера, он запускается при запуске приложения. Есть ли способ сгенерировать действительный UrlHelper или, если нет, сгенерировать действительный URL-адрес, не прибегая к путям жесткого кодирования, когда он не зависит от контроллеров?


person Simon Parker    schedule 13.02.2013    source источник


Ответы (1)


Это теоретически ... ref msdn и так .. .бытие в фоновом потоке делает вещи интересными :)

var request = new HttpRequest("/", "http://example.com", ""); //hopefully you can hardcode this or pull from config?
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);

var httpContextBase = new HttpContextWrapper(httpContext);
var routeData = new RouteData();
var requestContext = new RequestContext(httpContextBase, routeData);

var urlHelper = new UrlHelper(requestContext);
var url = urlHelper.Action("ActionName", "ControllerName");
person felickz    schedule 13.02.2013
comment
Кажется обидным жестко кодировать базовый URL-адрес, особенно учитывая, что он может меняться в зависимости от того, запускаю ли я тестовый или рабочий. Я бы надеялся, что есть какой-то способ получить базовый URL-адрес из приложения. - person Simon Parker; 14.02.2013
comment
Вы можете передать информацию HttpContext.Current в ваш фоновый поток, когда вы его раскручиваете ... убедитесь, что вы используете только его базовую часть url! stackoverflow.com/questions/3398717/ - person felickz; 14.02.2013
comment
HttpContext.Current недоступен при запуске приложения, когда @SimonParker хочет иметь возможность сгенерировать URL-адрес маршрута. - person Paul d'Aoust; 29.07.2015
comment
@SimonParker Вы можете проделать некоторые хитрые вещи с Microsoft.Web.Administration.WebConfigurationManager, чтобы получить список текущих привязок сайтов во время выполнения. Тогда вы можете просто взять первую привязку. Это некрасиво, но работает! - person Paul d'Aoust; 29.07.2015