我必须建立一个程序,让我从一个系统被击中不同的触发点跟踪。WPF设计注意事项使用WebBrowser控件
当触发已经被另一个系统调用Web服务中的命中,此Web服务将记录到数据库中的以下内容:
- 会员ID
- 触发Id
- 参考代码
我的程序以读取该数据并调用了子公司跟踪到关联公司的网站的电话。
唯一麻烦的是,这些网站不提供任何好的Web服务或形式后,它通过跟踪像素(从某种程序自己的服务器上创建的映像)或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();
}
}
}
到Web浏览器的调用在这里
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);
和制作程序只是等待是这样做的错误的方式。
任何人都可以提出一个更好的办法?我甚至在这里使用正确的技术解决了这个问题?
我认为,但后来不能工作,如何我会通过我的名单以此来等待它完成itterate。除非我有某种变量表示可以处理列表中的下一个对象,有点像漏水桶?但是,这会对我运行一个紧密的循环,而(cannotProcessNextItem){//坐着,什么也不做} – jimplode 2010-10-20 15:33:36
曾在WCF使用不同的事件,我现在等待网页完全加载,然后我处理下一个。 – jimplode 2010-10-27 13:56:05