2008-12-08 111 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属性)。

根据错误,您可以重新启动您的请求或将错误显示给用户。

我希望我不完全脱离轨道。