我必須建立一個程序,讓我從一個系統被擊中不同的觸發點跟蹤。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