2008-12-08 107 views
2

我有一個帶有BackgroundWorker的Winform。除此之外,BackgroundWorker必須對頁面進行HTTP調用,填寫一些數據,提交表單並檢索在「單擊」提交按鈕後返回的HTML。我這樣做遇到了一些障礙:C#/ Winform:輸入數據到HTML頁面,提交表格

  1. 無法發佈數據,因爲目標web服務器不支持該方法。
  2. 不能再使用WebClient.UploadValues,因爲Web服務器不支持POST。
  3. 不能使用WebBrowser控件,因爲BackgroundWorkers吸吮COM Interop並拋出異常,說明它必須位於STA線程中(單線程公寓)
  4. 無法運行另一個單獨的線程,因爲BW有坐在等待結果,然後才能繼續(不能,或者至少我不知道一種方法來做到這一點,不會崩潰)
  5. 無法更改線程的ApartmentState,因爲它是一個BackgroundWorker和它拋出如果被告知去STA模式

我應該怎麼做才能解決這個問題?

[編輯]:應用程序入口點已標記爲[STAThread]屬性。

回答

0

在這種情況下,它不支持POST的Web服務器是什麼?可比的HTML表單可以做什麼? POST或GET?只要做同樣的事情。我懷疑WebClient或HttpWebRequest可以很好地完成這項工作。

+0

這是一個帶有兩個文本框和一個登錄按鈕的內部應用程序。表單本身有一個javascript事件onClick,強制回發(哇,這很不尋常);如第2點所述,WebClient拋出;一個HttpWebRequest如何與一個有效載荷和不使用POST方法? – tsilb 2008-12-08 20:28:16

0

不要使用後臺工作者?

如果你這樣做,你可以將ApartmentState設置爲你想要的。只需記住在將數據推送回任何Form控件時調用/ BeginInvoke。

+0

這有點違背了使用BackgroundWorker的目的 - UI線程將完成所有的工作。 – 2008-12-08 20:02:10

+0

呃什麼?不,您不需要BackgroundWorker對象在後臺執行任務。您可以使用ThreadPool.QueueUserWorkItem或新線程(SomeMethod).Start()。在後者的情況下,您可以設置公寓狀態。 – Quibblesome 2008-12-08 21:23:56

2

您是否嘗試過使用WebClient.UploadValues並將Method參數設置爲「GET」?

+0

是的,我做了,並得到「System.Net.ProtocolViolationException:不能發送一個內容與這個動詞類型的身體。」 – tsilb 2008-12-08 20:30:45

0

我很不確定你真的在問什麼。如果您運行後臺進程並且失敗,則通過RunWorkerCompletedEvent獲取此報告。如果您接着查看事件路徑,您可以判斷進程是否成功(通過RunWorkerCompletedEventArgs.Error屬性)。

根據錯誤,您可以重新啓動您的請求或將錯誤顯示給用戶。

我希望我不完全脫離軌道。