Обработка Session_Start в модуле Orchard CMS

Немного предыстории:

Нам нужно разработать собственный модуль Orchard для клиента, который будет перехватывать внешний реферер URL (если есть) и сохранять его в переменной сеанса для последующего использования, например. отправки запроса на один из своих продуктов.

Мое наивное решение состояло в том, чтобы предложить записать реферер URL в Session_Start, потому что это надежный способ узнать, как пользователь попал на наш сайт. Проблема в том, что клиент не хочет, чтобы мы касались файла global.asax.cs. Это должно быть сделано через специальный модуль. Это не подлежит обсуждению.

Итак, мой вопрос заключается в следующем: как я могу надежно получить и сохранить информацию UrlReferrer, когда новый сеанс начинается с использованием модуля Orchard?

Или, в качестве альтернативы, есть ли другой способ подключиться к жизненному циклу страницы и, возможно, проверить, была ли предыдущая страница внешним реферером?

Моя самая важная проблема здесь заключается в том, что мне нужно знать, щелкнул ли кто-то по рекламной ссылке, и мне нужно выяснить это в модуле, а не в global.asax.cs. Я не зациклен на каком-либо конкретном методе отслеживания, если это возможно в рамках Orchard с учетом наложенных на меня ограничений.

К вашему сведению: версия Orchard 1.8+.


person Captain Kenpachi    schedule 21.04.2016    source источник
comment
Я предполагаю, что ваш клиент хочет, чтобы вы не только НЕ касались global.asax.cs, но и основные модули Orchard в целом, это правильно? В противном случае вы можете создать обработчик событий и запустить его из метода DefaultOrchardHosts.BeginRequest().   -  person Xceno    schedule 21.04.2016
comment
Вы предположили правильно. Я в основном застрял, чтобы сделать это через модуль, как я описал.   -  person Captain Kenpachi    schedule 21.04.2016
comment
Это очень плохо, я потратил довольно много времени на поиск источника для подключения, но кажется, что эта конкретная вещь еще недоступна. Может быть, я найду что-нибудь позже сегодня   -  person Xceno    schedule 22.04.2016


Ответы (2)


Это можно сделать через фильтр. Я реализовал это некоторое время назад в своем модуле коммерции, чтобы, как правило, предоставлять скидки или атрибуции за конверсии с партнерских сайтов. Вы можете увидеть исходный код моего фильтра здесь: https://github.com/bleroy/Nwazet.Commerce/blob/master/Filters/ReferrerFilter.cs

person Bertrand Le Roy    schedule 25.04.2016

Что бы я сделал, это создать собственный модуль и там собственный контроллер:

public class ReferrerController : Controller {
    public ActionResult Index(string referrer) {

        if (Session["Referrer"] != null) {
            // do nothing, already used as entry point in the current session
        } else {
            // handle referrer, probably also some timestamp or hash
            Session["Referrer"] = referrer; // save in session
        }
        return RedirectToRoute("~/"); // redirect to home
    }
}

Очевидно, также создайте маршрут для этого. Затем от внешних рефереров перейдите к этому маршруту, где будут обрабатываться рефереры. (http://example.com/referrer?referrer=somereferrer)

person devqon    schedule 21.04.2016
comment
Спасибо. Но я не могу контролировать, на какую страницу попадают рефереры. Но я дам вам голос, потому что я прямо не указал эту часть в вопросе. - person Captain Kenpachi; 21.04.2016
comment
Избегайте использования сеанса. Вместо этого используйте файлы cookie. - person Szymon Seliga; 21.04.2016
comment
@SzymonSeliga Мне интересно, что там с Session? Как насчет пользователей, которые отключили файлы cookie? - person Xceno; 22.04.2016
comment
Если пользователи отключают файлы cookie (что никто не должен делать), то сеанс также прерывается, потому что он полагается на файлы cookie (существуют сеансы без файлов cookie, которые технически возможны, но в настоящее время существует консенсус в отношении того, что они отстой и не должны использоваться -fwiw, они полагаются на токены URL и требуют перезаписи всех ссылок на сайте; ew-). - person Bertrand Le Roy; 25.04.2016