Создание относительных URL-адресов в пользовательских классах asp.net webform без запроса - PullRequest
0 голосов
/ 14 сентября 2018

У меня реализовано какое-то планирование работы, которое вызывает функцию ProcessJob. Теперь внутри этого метода мне нужно сгенерировать url на одну из моих страниц, т.е. DoanloadPage.aspx? Some_params. Этот URL-адрес отправляется пользователю по электронной почте, и когда пользователь нажимает эту ссылку, он переходит на страницу.

Проблема в том, что я не генерирую URL в методе веб-запроса или у меня нет доступа к объекту запроса. URL должен быть сгенерирован в пользовательском классе с многопоточностью, т.е. не в веб-запросе.

Так что я не могу пойти с этими решениями:

HostingEnvironment.MapPath("test.aspx");
VirtualPathUtility.ToAbsolute("123.aspx");
HttpContext.Current.Request.Url.Authority;

Ничего из этого не работает, потому что я думаю, что они все как-то полагаются на текущий запрос или сеанс. Итак, как мне генерировать URL для моего приложения внутри моего кода, чтобы я мог использовать их в любом случае.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вы можете сделать что-то вроде этого. Dns.GetHostName вернет имя компьютера, на котором размещен сайт. Вы можете использовать это, чтобы проверить, находится ли сайт на сервере разработки.

string domain = "www.productionurl/123.aspx";

if (Dns.GetHostName() == "Development")
{
    domain = "www.developmenturl/123.aspx";
}

Dns.GetHostName() - не единственный способ проверки. Вы также можете использовать HostingEnvironment.ApplicationPhysicalPath. Вы также можете проверить это и посмотреть, является ли путь сервера разработки.

0 голосов
/ 23 сентября 2018

Мой ответ: не делай этого.Вы строите распределенную систему, хотя и простую, и, вообще говоря, сложно ввести связь между службами в распределенной системе.Таким образом, даже если вы можете заполнить свой домен с помощью Application_BeginRequest, вы затем привязываете поведение своей пакетной работы к своему веб-сайту.При таком расположении вы рискуете распространять ошибки и усложняете развертывание вашей системы.

Лучший способ взглянуть на эту проблему - осознать, что основное желание заключается в синхронизации привязки вашего рабочего сайта с URL-адресом.это используется в вашей пакетной работе.Во многих случаях запись в app.config вашего пакета будет лучшим решением, на самом деле нет необходимости вводить код, если вы не знаете, что ваш URL будет часто меняться или вам нужно будет масштабировать до множества разных произвольных URL.,Если вам необходимо поддерживать изменение URL-адреса программным способом, я рекомендую вам взглянуть на настройку системы распределенной конфигурации, такой как Consul, и прочитать текущие URL-адреса из вашей системы развертывания для привязки IIS и файла app.config для вашего пакета.Так что даже в этом сложном сценарии нет прямого взаимодействия между вашей партией и вашим веб-сайтом.

0 голосов
/ 17 сентября 2018

Если ваш метод не может использовать HttpContext.Current.Request.Url, например, если это фоновое запланированное задание, вы можете использовать любой из следующих параметров:

  • В случае, если ваш кодразмещенный в том же приложении ASP.NET, вы можете передать имя домена сайта вашему классу в первом запросе.Для этого вам нужно обработать событие Application_BeginRequest и получить домен из HttpContext.Current.Request.Url, а затем передать его своему классу или сохранить в хранилище области приложения.Вы можете найти реализацию в этой публикации или в оригинальной статье .
    Примечание: код доступен в SO, поэтому я не повторяю здесь код.

  • Если ваш код размещен не в том же приложении ASP.NET или по какой-либо причине вы не хотите полагаться на Application_BeginRequest, в качестве другого варианта вы можетесохраните имя домена сайта в настройках (например, appsettigs в app.condig или web.config, если это веб-приложение) и используйте его в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...