从 2.2 迁移到 2.3

在 DotNetBrowser 2.3 中,Chromium 引擎已升级到 84 版本。 这个 Chromium 版本在源代码中有一些破坏性的更改,影响了产品的公共 API。 在本迁移指南中,我们将介绍 2.3 中已删除/更改的 API,以及应该使用的替代方案。

已删除的 API

网络

覆盖 HTTP 请求读取器

SendHeadersHandlerSendProxyHeadersHandler 已在 Chromium 84 中删除。

v2.2

network.SendHeadersHandler =
    new Handler<SendHeadersParameters, SendHeadersResponse>((parameters) =>
    {
        IEnumerable<IHttpHeader> headers = parameters.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return SendHeadersResponse.OverrideHeaders(newHttpHeaders);
    });
network.SendProxyHeadersHandler =
    new Handler<SendProxyHeadersParameters, SendProxyHeadersResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return SendProxyHeadersResponse.OverrideHeaders(newHttpHeaders);
    });
network.SendHeadersHandler = 
    New Handler(Of SendHeadersParameters, SendHeadersResponse)(Function(parameters)
        Dim headers As IEnumerable(Of IHttpHeader) = parameters.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return SendHeadersResponse.OverrideHeaders(newHttpHeaders)
End Function)
network.SendProxyHeadersHandler = 
    New Handler(Of SendProxyHeadersParameters, SendProxyHeadersResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return SendProxyHeadersResponse.OverrideHeaders(newHttpHeaders)
End Function)

v2.3

在将 HTTP 标头发送到网络服务器之前,使用 INetwork.StartTransactionHandler API 来覆盖这些标头:

INetwork.StartTransactionHandler = 
    new Handler<StartTransactionParameters, StartTransactionResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return StartTransactionResponse.OverrideHeaders(newHttpHeaders);
    });
INetwork.StartTransactionHandler = 
    New Handler(Of StartTransactionParameters, StartTransactionResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return StartTransactionResponse.OverrideHeaders(newHttpHeaders)
End Function)

过滤资源

LoadResourceHandler 处理程序已在 Chromium 84 中删除。

v2.2

engine.Network.LoadResourceHandler =
    new Handler<LoadResourceParameters, LoadResourceResponse>(p =>
    {
        if (p.ResourceType == ResourceType.Image)
        {
            return LoadResourceResponse.Cancel();
        }
        return LoadResourceResponse.Continue();
    });
engine.Network.LoadResourceHandler = 
    New Handler(Of LoadResourceParameters, LoadResourceResponse)(Function(p)
        If p.ResourceType = ResourceType.Image Then
            Return LoadResourceResponse.Cancel()
        End If
        Return LoadResourceResponse.Continue()
End Function)

v2.3

应改用 SendUrlRequestHandler。 在 DotNetBrowser 2.3 中,还提供了取消请求的功能:

engine.Network.SendUrlRequestHandler =
    new Handler<SendUrlRequestParameters, SendUrlRequestResponse>(p =>
    {
        if (p.ResourceType == ResourceType.Image)
        {
            return SendUrlRequestResponse.Cancel();
        }
        return SendUrlRequestResponse.Continue();
    });
engine.Network.SendUrlRequestHandler = 
    New Handler(Of SendUrlRequestParameters, SendUrlRequestResponse)(Function(p)
        If p.ResourceType = ResourceType.Image Then
            Return SendUrlRequestResponse.Cancel()
        End If
        Return SendUrlRequestResponse.Continue()
End Function)

RequestCompleted 事件

RequestCompletedEventArgs.IsStarted 属性已被删除,因为现在 URL 请求如果尚未启动,则无法完成。 因此,这个属性没有意义,因为它始终返回 true

导航

FrameLoadFailed 事件

FrameLoadFailedEventArgs.ErrorDescription 属性已被删除。 Chromium 84 不再支持该功能。

添加或更新的 API

URL 请求

UrlRequest 类已通过添加 BrowserResourceTypeSslVersion 属性进行了扩展。 所有这些属性都可以用来获取关于此 URL 请求的更多信息,包括发起此请求的浏览器、所请求资源的类型以及用于执行此请求的 SSL 版本。

因此,现在可以在 InterceptRequestHandler 中获取绑定的 IBrowser 实例:

``csharp Engine.Network.InterceptRequestHandler = new Handler<InterceptRequestParameters, InterceptRequestResponse>(data => { //访问与 URL 请求绑定的浏览器。 IBrowser browser = data.UrlRequest.Browser; // 告诉 Chromium 引擎处理此请求。 return InterceptRequestResponse.Proceed(); });

{: .code-tab-content lang="C#"}
``vb
Engine.Network.InterceptRequestHandler = 
    New Handler(Of InterceptRequestParameters, InterceptRequestResponse)(Function(data)
        ' 访问绑定到 URL 请求的浏览器。
        Dim browser As IBrowser = data.UrlRequest.Browser
        ' 告诉 Chromium 引擎处理此请求。
        Return InterceptRequestResponse.Proceed()
End Function)

保存为 PDF

SaveAsPdfParameters 中添加了 SuggestedFileNameSuggestedDirectory 属性。

``csharp browser.Dialogs.SaveAsPdfHandler = new Handler<SaveAsPdfParameters, SaveAsPdfResponse>(p => { // 应保存给定文件。 string pdfFile = Path.Combine(p.SuggestedDirectory, p.SuggestedFileName); return SaveAsPdfResponse.SaveToFile(pdfFile); });

{: .code-tab-content lang="C#"}
```vb
browser.Dialogs.SaveAsPdfHandler = 
    New Handler(Of SaveAsPdfParameters, SaveAsPdfResponse)(Function(p)
        ' 应保存给定文件。
        Dim pdfFile As String = Path.Combine(p.SuggestedDirectory, p.SuggestedFileName)
        Return SaveAsPdfResponse.SaveToFile(pdfFile)
End Function)

拖放

EnterDragHandlerDropHandler 已添加到 IDragAndDrop中。 这些处理程序可用于在硬件加速渲染模式下拦截网页上相应的拖放事件。 例如:

browser.DragAndDrop.EnterDragHandler = new Handler<EnterDragParameters>(OnDragEnter);
browser.DragAndDrop.DropHandler = new Handler<DropParameters>(OnDrop);
private void OnDragEnter(EnterDragParameters arg)
{
    if (arg.Event.DropData != null)
    {
        // 将文件名写入调试输出。
        foreach (IFileValue file in arg.Event.DropData.Files)
        {
            Debug.WriteLine($"OnDragEnter: File = {file?.FileName}");
        }
    }
}
private void OnDrop(DropParameters arg)
{
    if (arg.Event.DropData != null)
    {
        //将文件名写入调试输出。
        foreach (IFileValue file in arg.Event.DropData.Files)
        {
            Debug.WriteLine($"OnDrop: File = {file?.FileName}");
        }
    }
}
browser.DragAndDrop.EnterDragHandler = New Handler(Of EnterDragParameters)(OnDragEnter)
browser.DragAndDrop.DropHandler = New Handler(Of DropParameters)(OnDrop)
Private Sub OnDragEnter(ByVal arg As EnterDragParameters)
    If arg.Event.DropData IsNot Nothing Then
        ' 将文件名写入调试输出。
        For Each file As IFileValue In arg.Event.DropData.Files
            Debug.WriteLine($"OnDragEnter: File = {file?.FileName}")
        Next file
    End If
End Sub
Private Sub OnDrop(ByVal arg As DropParameters)
    If arg.Event.DropData IsNot Nothing Then
        ' 将文件名写入调试输出。
        For Each file As IFileValue In arg.Event.DropData.Files
            Debug.WriteLine($"OnDrop: File = {file?.FileName}")
        Next file
    End If
End Sub

在 .NET Framework 中,还可以在这些处理程序的作用域内使用 IDataObject 实例来接收和处理拖放数据的特定平台表示。 当指定--enable-com-in-drag-drop Chromium 开关时,此功能可用。 例如:

private void OnDragEnter(EnterDragParameters arg)
{
    System.Runtime.InteropServices.ComTypes.IDataObject dataObject = arg.Event.DataObject;
    if (dataObject != null)
    {
        //处理 IDataObject 内容。
    }
}
private void OnDrop(DropParameters arg)
{
    System.Runtime.InteropServices.ComTypes.IDataObject dataObject = arg.Event.DataObject;
    if (dataObject != null)
    {
        //处理 IDataObject 内容。
    }
}
Private Sub OnDragEnter(ByVal arg As EnterDragParameters)
    Dim dataObject As System.Runtime.InteropServices.ComTypes.IDataObject = 
        arg.Event.DataObject
    If dataObject IsNot Nothing Then
        ' 处理 IDataObject 内容.
    End If
End Sub
Private Sub OnDrop(ByVal arg As DropParameters)
    Dim dataObject As System.Runtime.InteropServices.ComTypes.IDataObject = 
        arg.Event.DataObject
    If dataObject IsNot Nothing Then
        ' 处理 IDataObject 内容。
    End If
End Sub

DOM

DOM 键盘事件

引入了 DomKeyCode 枚举,并在 DOM 键盘事件中代替现有的 KeyCode 枚举。 先前获取按键代码的实现依赖于过时的DOM API,并且在某些情况下似乎无法正常工作。

Character 属性也被添加到 DOM 键盘事件中,以便在 DOM 事件可用时提供实际字符。

Go Top