2008-12-08 3 views
2

У меня есть Winform с BackgroundWorker. BackgroundWorker, помимо прочего, должен сделать HTTP-вызов страницы, заполнить некоторые данные, отправить форму и получить HTML-код, который возвращается после нажатия кнопки отправки. При этом я столкнулся с рядом блокпостов:C#/Winform: введите данные в HTML-страницу, отправьте форму

  1. Не удается отправить данные, потому что целевой веб-сервер не поддерживает этот метод.
  2. Невозможно использовать WebClient.UploadValues, опять же, потому что веб-сервер не поддерживает POST.
  3. Невозможно использовать элемент управления WebBrowser, потому что BackgroundWorkers посасывать COM Interop и исключение, что говорит, что это должно быть в STA потоке (однопоточном)
  4. Не удается запустить другой отдельный поток, потому что BW имеет сидеть и ждать результата, прежде чем он сможет продолжить (не может, или, по крайней мере, я не знаю, как это сделать, чтобы не сбой)
  5. Невозможно изменить ApartmentState потока, потому что это BackgroundWorker, и он бросает, если ему сказали перейти в режим STA

Что мне делать, чтобы разрешить это?

[Изменить]: точка входа приложения уже отмечена атрибутом [STAThread].

ответ

0

Какой веб-сервер не поддерживает POST в этом сценарии? Что делает сопоставимая форма HTML? POST или GET? Просто сделайте то же самое. Я подозреваю, что WebClient или HttpWebRequest отлично справятся с этой задачей.

+0

Это внутреннее приложение с двумя текстовыми полями и кнопкой для входа в систему. Сама форма имеет событие javascript onClick, которое заставляет обратную передачу (ничего себе, это необычно); WebClient выбрасывается, как указано в пункте 2; как один HttpWebRequest с полезной нагрузкой и не используя метод POST? – tsilb 2008-12-08 20:28:16

0

Не использовать фонового работника?

Если вы сделаете это, вы можете установить ApartmentState на то, что вы хотите. Просто не забудьте вызывать/BeginInvoke при нажатии данных на элементы управления Form.

+0

Этот вид поражает цель использования BackgroundWorker - поток пользовательского интерфейса будет выполнять всю работу. – 2008-12-08 20:02:10

+0

Э-э-э-э? Нет, вам не нужен объект BackgroundWorker, чтобы делать что-то в фоновом режиме. Вы можете использовать ThreadPool.QueueUserWorkItem или новый Thread (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. Если вы посмотрите на eventarguments, вы можете определить, был ли процесс успешным или нет (через свойство RunWorkerCompletedEventArgs.Error).

В зависимости от ошибки вы можете повторно запустить запрос или отобразить ошибку пользователю.

Надеюсь, что я не совсем с дороги.