Вопросы проектирования WPF с использованием элемента управления WebBrowser - PullRequest
0 голосов
/ 20 октября 2010

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

Когда в другой системе вызывается триггер, вызывается веб-служба, эта веб-служба регистрирует в базе данных следующее:

  1. Партнерский идентификатор
  2. Идентификатор триггера
  3. Ссылочный код

Моя программа заключается в чтении этих данных и вызове веб-сайтов партнеров для отслеживания партнерских программ.

Единственная проблема в том, что эти сайты не предлагают какой-либо приятный веб-сервис или форму публикации, это делается через пиксели отслеживания (изображения, созданные с помощью какого-либо процесса на их сервере) или через 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); и заставление программы просто ждать - неправильный способ сделать это.

Может кто-нибудь предложить лучший способ? Я когда-нибудь занимался этим, используя правильные технологии здесь?

1 Ответ

1 голос
/ 20 октября 2010
...