CEFSharp - 如何从 build 75.1.143 访问 OnResourceResponse
CEFSharp - How can I access OnResourceResponse from build 75.1.143
自从 Visual Studio 决定将其更新为构建 77.1.18 以来,我一直在 WinForms 中使用 CEFSharp 度过了一段凶残的时光,而 Nuget 搞砸了整个事情,只留下安装了三个版本,但拒绝卸载其中任何一个!为了解决这些问题,我不得不手动编辑各种解决方案和项目文件,并得到它,以便我安装了 build 75 并且大部分工作正常。
然后系统通知我 DefaultRequestHandler 现已过时,我应该改用 RequestHandler。这很好,并且需要进行一些更改,例如使覆盖受保护而不是 public。全部完成,除了一件事:OnResourceResponse。它坚持认为这不再存在。我搜索了所有我能找到的东西,文档中的所有参考资料和 Google 搜索等都指的是相当旧的 build 55。不幸的是,为了手头的特定目的,我需要能够捕获任何不是 200 的响应,并在关闭视图之前将错误信息传递回视图。
根据我能够找到的文档,RequestHandler 实现了 IRequestHandler,它应该包含这个事件处理程序,但是 Intellisense 没有提供任何实现,如果我忽略 Intellisense 那么显然我无法编译...
这是我使用的原始代码,需要复制:
public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
//NOTE: You cannot modify the response, only the request
// You can now access the headers
//var headers = response.Headers;
// If it is not an OK response, set the error and close the dialog
if (response.StatusCode != (int)HttpStatusCode.OK)
{
var error = $"{response.StatusCode}: {response.StatusText}";
var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
var parent = (MyBrowserForm)chromiumWebBrowser.Parent.Parent.Parent;
parent.Errors = error;
browser.CloseBrowser(true);
return true;
}
return false;
}
谁能告诉我如何让它像更新前一样工作?
编辑:
因为我还有其他(不同的)nuget 问题,所以要进行最终测试,答案有点像已接受答案中的建议。如果其他人需要它,这是我必须做的:
public class MyBrowserResourceRequestHandler : ResourceRequestHandler
{
protected override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
//NOTE: You cannot modify the response, only the request
// You can now access the headers
//var headers = response.Headers;
// If it is not an OK response, set the error and close the dialog
if (response.StatusCode != (int)HttpStatusCode.OK)
{
var error = $"{response.StatusCode}: {response.StatusText}";
var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
var parent = (MyBrowserForm)chromiumWebBrowser.Parent.Parent.Parent;
parent.Errors = error;
browser.CloseBrowser(true);
return true;
}
return false;
}
}
然后,在原来的class中,添加这个覆盖的方法:
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
return new MyBrowserResourceRequestHandler();
}
现在所有编译都正确了,初始测试看起来不错。如果需要进一步更改,我会更新。
看来在版本 75 中,您应该改为查看 ResourceRequestHandler
,因此您将继承此 class 并使用它。 OnResourceResponse
里面可以找到
以下是来自 ResourceRequestHandler.cs
的示例代码,您可以在 CefSharp/CefSharp/Handler/ResourceRequestHandler.cs
中的 CEFSharp repository 中找到它
bool IResourceRequestHandler.OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return OnResourceResponse(chromiumWebBrowser, browser, frame, request, response);
}
因此您只需从 ResourceRequestHandler
:
覆盖 OnResourceResponse
protected override bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
//Do whatever you like
}
自从 Visual Studio 决定将其更新为构建 77.1.18 以来,我一直在 WinForms 中使用 CEFSharp 度过了一段凶残的时光,而 Nuget 搞砸了整个事情,只留下安装了三个版本,但拒绝卸载其中任何一个!为了解决这些问题,我不得不手动编辑各种解决方案和项目文件,并得到它,以便我安装了 build 75 并且大部分工作正常。
然后系统通知我 DefaultRequestHandler 现已过时,我应该改用 RequestHandler。这很好,并且需要进行一些更改,例如使覆盖受保护而不是 public。全部完成,除了一件事:OnResourceResponse。它坚持认为这不再存在。我搜索了所有我能找到的东西,文档中的所有参考资料和 Google 搜索等都指的是相当旧的 build 55。不幸的是,为了手头的特定目的,我需要能够捕获任何不是 200 的响应,并在关闭视图之前将错误信息传递回视图。
根据我能够找到的文档,RequestHandler 实现了 IRequestHandler,它应该包含这个事件处理程序,但是 Intellisense 没有提供任何实现,如果我忽略 Intellisense 那么显然我无法编译...
这是我使用的原始代码,需要复制:
public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
//NOTE: You cannot modify the response, only the request
// You can now access the headers
//var headers = response.Headers;
// If it is not an OK response, set the error and close the dialog
if (response.StatusCode != (int)HttpStatusCode.OK)
{
var error = $"{response.StatusCode}: {response.StatusText}";
var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
var parent = (MyBrowserForm)chromiumWebBrowser.Parent.Parent.Parent;
parent.Errors = error;
browser.CloseBrowser(true);
return true;
}
return false;
}
谁能告诉我如何让它像更新前一样工作?
编辑:
因为我还有其他(不同的)nuget 问题,所以要进行最终测试,答案有点像已接受答案中的建议。如果其他人需要它,这是我必须做的:
public class MyBrowserResourceRequestHandler : ResourceRequestHandler
{
protected override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
//NOTE: You cannot modify the response, only the request
// You can now access the headers
//var headers = response.Headers;
// If it is not an OK response, set the error and close the dialog
if (response.StatusCode != (int)HttpStatusCode.OK)
{
var error = $"{response.StatusCode}: {response.StatusText}";
var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
var parent = (MyBrowserForm)chromiumWebBrowser.Parent.Parent.Parent;
parent.Errors = error;
browser.CloseBrowser(true);
return true;
}
return false;
}
}
然后,在原来的class中,添加这个覆盖的方法:
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
return new MyBrowserResourceRequestHandler();
}
现在所有编译都正确了,初始测试看起来不错。如果需要进一步更改,我会更新。
看来在版本 75 中,您应该改为查看 ResourceRequestHandler
,因此您将继承此 class 并使用它。 OnResourceResponse
里面可以找到
以下是来自 ResourceRequestHandler.cs
的示例代码,您可以在 CefSharp/CefSharp/Handler/ResourceRequestHandler.cs
bool IResourceRequestHandler.OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return OnResourceResponse(chromiumWebBrowser, browser, frame, request, response);
}
因此您只需从 ResourceRequestHandler
:
OnResourceResponse
protected override bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
//Do whatever you like
}