CEFSharp-如何从内部版本75.1.143访问OnResourceResponse

问题描述 投票:0回答:1

自从Visual Studio决定将其更新到内部版本77.1.18以来,我就一直在WinForms中与CEFSharp一起度过一个杀人的时期,Nuget搞砸了整个过程,保留了三个版本的安装,但拒绝卸载其中任何一个!为了解决问题,我必须手动编辑各种解决方案和项目文件,并进行安装,以便我已安装75版本并且可以正常工作。

然后系统通知我DefaultRequestHandler现在已过时,我应该改用RequestHandler。很好,并且需要进行一些更改,例如将替代设置为受保护而不是公开。全部完成,除了一件事: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;
    }

[谁能告诉我如何使它像更新前一样工作?

编辑:

要接受最终测试,因为我仍然遇到其他(不同)的问题,答案与所接受答案中的建议相似。万一其他人需要它,这就是我要做的:

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;
    }
}

然后,在原始类中,添加此重写的方法:

    protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
    {
        return new MyBrowserResourceRequestHandler();
    }

现在,它们都可以正确编译,并且初始测试看起来不错。如果需要任何进一步的更改,我将进行更新。

c# winforms cefsharp
1个回答
0
投票

[似乎在版本75中,您应该查看ResourceRequestHandler,因此您将从该类继承并使用它。可以在其中找到OnResourceResponse

以下是ResourceRequestHandler.cs中的示例代码,您可以在repository中的CEFSharp 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);
  }

所以您只需要从OnResourceResponse覆盖ResourceRequestHandler

protected override bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
   //Do whatever you like
}

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.