从 2.2 迁移到 2.3
在 DotNetBrowser 2.3 中,Chromium 引擎已升级到 84 版本。 这个 Chromium 版本在源代码中有一些破坏性的更改,影响了产品的公共 API。 在本迁移指南中,我们将介绍 2.3 中已删除/更改的 API,以及应该使用的替代方案。
已删除的 API
网络
覆盖 HTTP 请求读取器
SendHeadersHandler
和 SendProxyHeadersHandler
已在 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
类已通过添加 Browser
、ResourceType
、SslVersion
属性进行了扩展。 所有这些属性都可以用来获取关于此 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
中添加了 SuggestedFileName
和 SuggestedDirectory
属性。
``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)
拖放
EnterDragHandler
和 DropHandler
已添加到 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 事件可用时提供实际字符。