使用 WebBrowser 控件的 WPF 设计注意事项

发布于 2024-09-28 17:50:01 字数 2138 浏览 0 评论 0原文

我必须构建一个程序,允许我从系统中跟踪不同的触发点。

当另一个系统中的触发器被调用时,该 Web 服务将向数据库记录以下内容:

  1. 联属营销 ID
  2. 触发器 ID
  3. 参考代码

我的程序是读取此数据并调用对联属营销网站的调用以进行联属营销跟踪。

唯一的麻烦是,这些网站不提供任何好的网络服务或表单发布,它是通过跟踪像素(通过其服务器上的某种进程创建的图像)或 JavaScript 来完成的。

所以我一直在尝试让它工作,我能想到的唯一方法是通过使用“WebBrowser”控件的 WPF 或 WinForms 应用程序。

因此,我只需从数据库中获取结果集,并为捕获的每个触发器获取所需的联属跟踪图像代码或 javascript 代码,然后使用参考号、联属 ID 等对预定义键进行替换。

我在这里关心的是WebBrowser 控件是异步的,在我要求 Web 浏览器加载另一个跟踪代码片段之前,它可能不会处理 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); 并使程序只是等待是错误的做法。

有人能建议更好的方法吗?我是否在这里使用正确的技术解决了这个问题?

I have to build a program that will allow me to track from a system different trigger points being hit.

When a trigger has been hit within another system a web service is called, this web service will log to a database the following:

  1. Affiliate Id
  2. Trigger Id
  3. Reference Code

My program is to read this data and invoke a call to affiliates websites for affiliate tracking.

The only trouble is, these sites do not offer any nice web service or form post, it is done via tracking pixels (images created from some kind of process on their server) or javascript.

So I have been playing around with this trying to get it working, and the only way I can think of doing it is via a WPF or WinForms application using the "WebBrowser" control.

So I simply get the results set out of the database and for each trigger captured get the required affiliate tracking image code or javascript code and then do replacements on predefined keys with the reference numbers, affiliate ids, etc.

My concern here, is as the WebBrowser control is asynchronous it may not process the javascript or image request before I ask the web browser to load another tracking code snippet.

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();
        }
    }


}

The calls to the web browser are here

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);
    }
}

My main concern is that using Thread.Sleep(2000); and making the program just wait is the wrong way of doing it.

Can anyone suggest a better way? Have I even tackled this using the right technologies here??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文