WinForms + cefsharp + HTTP POST

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von TomTheOne.

    WinForms + cefsharp + HTTP POST

    Hi Zusammen

    Ich habe eine Frage zur cefsharp library von Chromium.

    Ich zeige mit dem nachfolgenden Code eine Webseite in einem Panel dar.

    Quellcode

    1. Private WithEvents browser As ChromiumWebBrowser
    2. Public Sub New()
    3. InitializeComponent()
    4. Dim settings As New CefSettings()
    5. CefSharp.Cef.Initialize(settings)
    6. browser = New ChromiumWebBrowser("https://www.hallowelt.com") With {
    7. .Dock = DockStyle.Fill
    8. }
    9. thuBrowser.Controls.Add(browser)
    10. End Sub


    Nun möchte ich nicht einfach die Webseite anzeigen; sondern ich möchte mittels HTTP POST ein paar Formularfelder senden. In HTML würde das so aussehen.

    Quellcode

    1. <form method="post" action="https://www.hallowelt.com/hallowelt.cfm" name="login">
    2. <input type="hidden" name="username" value="a_username">
    3. <input type="hidden" name="password" value="a_password">
    4. </form>


    Hat damit jemand Erfahrung und könnte mir etwas Starthilfe geben; wie ich das realisieren könnte?

    Gruss
    Tom
    Hi Zusammen

    Ich habe eine (halbe) Lösung gefunden:

    Quellcode

    1. Imports CefSharp
    2. Imports CefSharp.WinForms
    3. Imports System.Windows.Forms
    4. Imports Microsoft.Win32
    5. Imports System.Text.Encoding
    6. Imports System.Runtime.CompilerServices
    7. Imports System.Collections.Specialized
    8. Public Class FormLauncher
    9. Private WithEvents browser As ChromiumWebBrowser
    10. Private _cachePath As String = IO.Path.Combine(Environment.CurrentDirectory, "cache")
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. Me.LaunchChromium()
    13. End Sub
    14. Public Sub LaunchChromium()
    15. Dim CefSettings As New CefSettings()
    16. If Not IO.Directory.Exists(_cachePath) Then IO.Directory.CreateDirectory(_cachePath)
    17. CefSettings.PersistSessionCookies = True
    18. CefSettings.CachePath = _cachePath
    19. CefSharp.Cef.Initialize(CefSettings)
    20. browser = New ChromiumWebBrowser("https://www.halowelt.com/irgendwas.cfm") With {
    21. thuBrowser.Controls.Add(browser)
    22. End Sub
    23. Public Sub IsBrowserInitalized() Handles browser.IsBrowserInitializedChanged
    24. Dim thuUsername As String = "a_username"
    25. Dim thuPassword As String = "a_password"
    26. Dim PostData As String
    27. Dim PostDataBytes() As Byte
    28. PostData = "username=" & thuUsername & "&password=" & thuPassword & "&login=login"
    29. PostDataBytes = UTF8.GetBytes(PostData)
    30. BrowserTest.PostTest.Navigate(browser, "https://www.halowelt.com/login.cfm", PostDataBytes, "application/x-www-form-urlencoded")
    31. browser.ShowDevTools()
    32. End Sub
    33. End Class
    34. Namespace BrowserTest
    35. Module PostTest
    36. <Extension()>
    37. Sub Navigate(ByVal browser As IWebBrowser, ByVal url As String, ByVal postDataBytes As Byte(), ByVal contentType As String)
    38. Dim frame As IFrame = browser.GetMainFrame()
    39. Dim request As IRequest = frame.CreateRequest()
    40. request.Url = url
    41. request.Method = "POST"
    42. request.InitializePostData()
    43. Dim element = request.PostData.CreatePostDataElement()
    44. element.Bytes = postDataBytes
    45. request.PostData.AddElement(element)
    46. Dim headers As NameValueCollection = New NameValueCollection()
    47. headers.Add("Content-Type", contentType)
    48. request.Headers = headers
    49. frame.LoadRequest(request)
    50. frame.GetTextAsync().ContinueWith(Function(taskHtml)
    51. Dim html = taskHtml.Result
    52. System.Windows.Forms.MessageBox.Show(html)
    53. End Function)
    54. Dim script As String = String.Format("document.documentElement.outerHTML")
    55. frame.EvaluateScriptAsync(script).ContinueWith(Function(x)
    56. Dim response = x.Result
    57. If response.Success AndAlso response.Result IsNot Nothing Then
    58. Dim fullhtml = response.Result
    59. System.Windows.Forms.MessageBox.Show(fullhtml.ToString())
    60. End If
    61. End Function)
    62. End Sub
    63. End Module
    64. End Namespace


    Damit klappt das einloggen an einer Webseite. Wenn ich dann jedoch einen Button in der Navigation anklicke, dann werde ich wieder auf die Loginseite zurückgeworfen. Irgend etwas scheint da nicht zu funktionieren.
    Wenn ich die Serverseite und VB.NET so umschreibe, dass kein POST Befehl mehr gemacht werden soll, sondern ein GET (VB.Net seitig wie im initalen Post); dann funktioniert alles wie gewohnt. Komisch

    Hat jemand dazu eine Idee?

    Gruss
    Tom

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TomTheOne“ ()