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
}