كيف يمكنني الوصول إلى PostData من معالج الأحداث WebBrowser.Navigating؟

StackOverflow https://stackoverflow.com/questions/141626

  •  02-07-2019
  •  | 
  •  

سؤال

لقد حصلت على نموذج Windows في Visual Studio 2008 باستخدام .NET 3.5 الذي يحتوي على عنصر تحكم WebBrowser.أحتاج إلى تحليل PostData للنموذج في معالج أحداث التنقل قبل إرسال الطلب.هل هناك طريقة للوصول إليه؟

كان عنصر تحكم متصفح Win32 القديم يحتوي على حدث Before_Navigate والذي كان يحتوي على PostData كأحد الوسائط الخاصة به.ليس الأمر كذلك مع عنصر تحكم .NET WebBrowser الجديد.

هل كانت مفيدة؟

المحلول

لا يتم الكشف عن هذه الوظيفة بواسطة عنصر تحكم .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 وليس المقصود استخدامها مباشرة من التعليمات البرمجية الخاصة بك.".بعبارة أخرى:قد يؤدي استخدامك للخاصية إلى تعطيل تطبيقك في أي وقت في المستقبل، على سبيل المثال عندما يقرر الأشخاص في إطار العمل تنفيذ مكون المتصفح الخاص بهم، بدلاً من تغليف مكون SHDocVw COM الحالي.

لذلك، لن ترغب في وضع هذا الرمز في أي شيء ترسله إلى الكثير من الأشخاص و/أو أي شيء يجب أن يظل يعمل للعديد من إصدارات Framework القادمة...

نصائح أخرى

نسخة #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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top