C# / Winform: введите данные на HTML-страницу, отправьте форму

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 096
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Это как бы противоречит цели использования BackgroundWorker - поток пользовательского интерфейса будет выполнять всю работу.

Marc Gravell 08.12.2008 23:02

Э-э-э-э? Нет, вам не нужен объект BackgroundWorker для работы в фоновом режиме. Вы можете использовать ThreadPool.QueueUserWorkItem или новый поток (SomeMethod) .Start (). В последнем случае вы можете установить состояние квартиры.

Quibblesome 09.12.2008 00:23

Вы пробовали использовать WebClient.UploadValues с аргументом Method, установленным на "GET"?

Да, я это сделал, и получил «System.Net.ProtocolViolationException: невозможно отправить тело содержимого с этим типом глагола».

tsilb 08.12.2008 23:30
Ответ принят как подходящий

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

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

tsilb 08.12.2008 23:28

Я совершенно не понимаю, о чем вы на самом деле спрашиваете. Если вы запускаете фоновый процесс и он терпит неудачу, вы получите сообщение об этом через RunWorkerCompletedEvent. Если вы затем посмотрите на аргументы события, вы сможете определить, был ли процесс успешным или нет (через свойство RunWorkerCompletedEventArgs.Error).

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

Надеюсь, я не совсем сбился с пути.

Да, но это требование (страница вызова, вход в систему, возврат результата на целевой странице) - лишь крошечная часть того, что на самом деле делает фоновый поток ... Фактически, это одна из примерно 20 различных вещей, которые должны быть выполнены с этим. нить. Я бы использовал другой BackgroundWorker, но у него были бы те же проблемы.

tsilb 08.12.2008 23:34

Другие вопросы по теме