Мне нужно создать программу, которая позволит мне отслеживать в системе различные точки срабатывания.
Когда в другой системе вызывается триггер, вызывается веб-служба, эта веб-служба регистрирует в базе данных следующее:
- Партнерский идентификатор
- Идентификатор триггера
- Ссылочный код
Моя программа заключается в чтении этих данных и вызове веб-сайтов партнеров для отслеживания партнерских программ.
Единственная проблема в том, что эти сайты не предлагают какой-либо приятный веб-сервис или форму публикации, это делается через пиксели отслеживания (изображения, созданные с помощью какого-либо процесса на их сервере) или через JavaScript.
Так что я пытался поиграть с этим, пытаясь заставить его работать, и единственный способ, которым я могу думать, это сделать через приложение WPF или WinForms с помощью элемента управления «WebBrowser».
Поэтому я просто получаю результаты из базы данных и для каждого полученного триггера получаю требуемый код изображения отслеживания партнера или код JavaScript, а затем выполняю замену предварительно определенных ключей ссылочными номерами, идентификаторами партнеров и т. Д.
Меня беспокоит то, что элемент управления WebBrowser асинхронный, он может не обрабатывать JavaScript или запрос изображения, прежде чем я попрошу веб-браузер загрузить другой фрагмент кода отслеживания.
List<TRACKING_TRANSACTIONS> trackingTransactions = affiliateContext.TRACKING_TRANSACTIONS.Where(at => at.EFFECTIVE_DATE <= DateTime.Now && at.PROCESSED_DATE == null ).ToList();
foreach (TRACKING_TRANSACTIONS transaction in trackingTransactions)
{
if (transaction != null)
{
AFFILIATE_TRIGGERS affiliateTrigger = affiliateContext.AFFILIATE_TRIGGERS.SingleOrDefault(at => at.AFFILIATE_ID == transaction.AFFILIATE_ID && at.TRIGGER_ID == transaction.TRIGGER_ID);
if (affiliateTrigger != null)
{
//do replacements
string trackingCode = ReplaceStringValues(affiliateTrigger.TRACKING_CODE, transaction);
RunWebBrowserTrackingCode(trackingCode);//ConfigurationManager.AppSettings["WebsiteUrl"] + "?trackingTransactionId=" + transaction.TRACKING_TRANSACTION_ID.ToString());
Thread.Sleep(2000);
transaction.PROCESSED_DATE = DateTime.Now;
affiliateContext.SaveChanges();
}
}
}
Звонки в веб-браузер здесь
void RunWebBrowserTrackingCode(string trackingCode)
{
if (!webBrowser.Dispatcher.CheckAccess())
{
webBrowser.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
webBrowser.NavigateToString(trackingCode);
}
));
}
else
{
webBrowser.NavigateToString(trackingCode);
}
}
Моя главная проблема в том, что использование Thread.Sleep(2000);
и заставление программы просто ждать - неправильный способ сделать это.
Может кто-нибудь предложить лучший способ? Я когда-нибудь занимался этим, используя правильные технологии здесь?