Как я могу получить доступ к PostData из обработчика событий WebBrowser.Navigating?

У меня есть форма Windows в Visual Studio 2008 с использованием .NET 3.5, на которой есть элемент управления WebBrowser. Мне нужно проанализировать PostData формы в обработчике событий Navigating перед отправкой запроса. Есть способ добраться до него?

В старом элементе управления браузера win32 было событие Before_Navigate, одним из аргументов которого было PostData. Не так с новым элементом управления .NET WebBrowser.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
12 076
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Эта функция не предоставляется элементом управления .NET WebBrowser. К счастью, этот элемент управления в основном является оболочкой «старого» элемента управления. Это означает, что вы можете подписаться на событие BeforeNavigate2, которое вы знаете и любите (?), Используя что-то вроде следующего (после добавления ссылки на SHDocVw в свой проект):

Dim ie = DirectCast(WebBrowser1.ActiveXInstance, SHDocVw.InternetExplorer)
AddHandler ie.BeforeNavigate2, AddressOf WebBrowser_BeforeNavigate2

... и делайте все, что хотите, с PostData внутри этого события:

Private Sub WebBrowser_BeforeNavigate2(ByVal pDisp As Object, ByRef URL As Object, _
       ByRef Flags As Object, ByRef TargetFrameName As Object, _
       ByRef PostData As Object, ByRef Headers As Object, ByRef Cancel As Boolean)
    Dim PostDataText = System.Text.Encoding.ASCII.GetString(PostData)
End Sub

Одно важное предостережение: в документация по свойству WebBrowser.ActiveXInstance говорится, что «Этот API поддерживает инфраструктуру .NET Framework и не предназначен для использования непосредственно из вашего кода». Другими словами: использование вами свойства может нарушить работу вашего приложения в любой момент в будущем, например, когда люди, работающие с Framework, решат реализовать свой собственный компонент браузера вместо того, чтобы оборачивать существующий компонент SHDocVw COM.

Таким образом, вы не захотите помещать этот код во все, что вы отправляете большому количеству людей, и / или во что-либо, что должно оставаться работающим для многих будущих версий Framework ...

Спасибо. Я боялся, что это может быть ответ. Мы специально перешли на новый WebBrowser, чтобы нам больше не приходилось ссылаться на ужасный shdocvw. Так что это действительно не работает для нас, хотя это правильный ответ.

user16324 29.09.2008 20:57

Версия C#

    /// <summary>
    /// Fires before navigation occurs in the given object (on either a window or frameset element).
    /// </summary>
    /// <param name = "pDisp">Object that evaluates to the top level or frame WebBrowser object corresponding to the navigation.</param>
    /// <param name = "url">String expression that evaluates to the URL to which the browser is navigating.</param>
    /// <param name = "Flags">Reserved. Set to zero.</param>
    /// <param name = "TargetFrameName">String expression that evaluates to the name of the frame in which the resource will be displayed, or Null if no named frame is targeted for the resource.</param>
    /// <param name = "PostData">Data to send to the server if the HTTP POST transaction is being used.</param>
    /// <param name = "Headers">Value that specifies the additional HTTP headers to send to the server (HTTP URLs only). The headers can specify such things as the action required of the server, the type of data being passed to the server, or a status code.</param>
    /// <param name = "Cancel">Boolean value that the container can set to True to cancel the navigation operation, or to False to allow it to proceed.</param>
    private delegate void BeforeNavigate2(object pDisp, ref dynamic url, ref dynamic Flags, ref dynamic TargetFrameName, ref dynamic PostData, ref dynamic Headers, ref bool Cancel);

    private void Form1_Load(object sender, EventArgs e)
    {
        dynamic d = webBrowser1.ActiveXInstance;

        d.BeforeNavigate2 += new BeforeNavigate2((object pDisp,
            ref dynamic url,
            ref dynamic Flags,
            ref dynamic TargetFrameName,
            ref dynamic PostData,
            ref dynamic Headers,
            ref bool Cancel) => {

            // Do something with PostData
        });
    }


Версия C# WPF

Сохраните вышеуказанное, но замените:

    dynamic d = webBrowser1.ActiveXInstance;

с:

    using System.Reflection;
    ...
    PropertyInfo prop = typeof(System.Windows.Controls.WebBrowser).GetProperty("ActiveXInstance", BindingFlags.NonPublic | BindingFlags.Instance);
    MethodInfo getter = prop.GetGetMethod(true);
    dynamic d = getter.Invoke(webBrowser1, null);

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