繁体   English   中英

CEFSharp - 如何从版本 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。 这很好,并且需要进行一些更改,例如将覆盖设置为保护而不是公开。 一切都完成了,除了一件事: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;
    }
}

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

    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 ,因此您将从该类继承并使用它。 OnResourceResponse可以在其中找到。

以下是来自ResourceRequestHandler.cs的示例代码,您可以在CefSharp/CefSharp/Handler/ResourceRequestHandler.cs内的 CEFSharp 存储库中找到它

  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
}

希望这对你有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM