Wpf 如何在CefSharp中确定来自服务器的响应是404?

Wpf 如何在CefSharp中确定来自服务器的响应是404?,wpf,cefsharp,Wpf,Cefsharp,我正在为CefSharp使用WPF控件。我需要知道我发出的请求何时收到http状态码404的响应 我注意到CefSharp有LoadError事件,但只有当域无法完全解析时才会触发(即,如果我访问www.sdfhjkhajsdf.com)。当域存在时,它不起作用,但您请求的页面不起作用。这是一个相当老的问题。CefSharp有很多很棒的更新,所以我希望这能帮助像我这样的搜索者。不要因为我的代码片段在VB.NET中而恨我 这就是我所做的记录任何不是200响应的事情。对于我的应用程序,我打开了请求页

我正在为CefSharp使用WPF控件。我需要知道我发出的请求何时收到http状态码404的响应


我注意到CefSharp有LoadError事件,但只有当域无法完全解析时才会触发(即,如果我访问www.sdfhjkhajsdf.com)。当域存在时,它不起作用,但您请求的页面不起作用。

这是一个相当老的问题。CefSharp有很多很棒的更新,所以我希望这能帮助像我这样的搜索者。不要因为我的代码片段在VB.NET中而恨我

这就是我所做的记录任何不是200响应的事情。对于我的应用程序,我打开了请求页面的一个新表单,因此我通过查看
refererUrl
属性将注意力限制在初始页面请求上。显然,您可以删除该部分,以便对所有请求发出警报

最初实现
ChromiumWebBrowser
时,需要为实现设置
RequestHandler

Me.chromeBrowser = New CefSharp.WinForms.ChromiumWebBrowser(uri)
Me.chromeBrowser.RequestHandler = New CefBasicRequestHandler()
Me.Controls.Add(Me.chromeBrowser)
CefSharp发布了一个默认实现,您可以使用它,只需覆盖
OnResourceResponse

Imports System.Security.Cryptography.X509Certificates
Imports CefSharp

Public Class CefBasicRequestHandler
  Inherits CefSharp.Handler.DefaultRequestHandler

  Private Shared ReadOnly Logger As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

  Public Overrides Function OnResourceResponse(browserControl As IWebBrowser, browser As IBrowser, frame As IFrame, request As IRequest, response As IResponse) As Boolean
    If String.IsNullOrWhiteSpace(request.ReferrerUrl) Then ' this is the first request of the page
        Dim method As String = "OnResourceResponse()."
        Dim requestOverview As String = $"[{response.StatusCode}] [{request.Url}]"
        Logger.Info($"{method} {requestOverview}")

        If response.StatusCode <> 200 Then
            Logger.Warn($"{method} {requestOverview}")
        End If
    End If

    Return MyBase.OnResourceResponse(browserControl, browser, frame, request, response)
  End Function
End Class
导入System.Security.Cryptography.X509证书
进口夏普
公共类CefBasicRequestHandler
继承CefSharp.Handler.DefaultRequestHandler
专用共享只读记录器log4net.ILog=log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
公共重写函数OnResourceResponse(浏览器控件作为IWebBrowser,浏览器作为IBrowser,框架作为IFrame,请求作为IRequest,响应作为IResponse)为布尔值
如果是String.IsNullOrWhiteSpace(request.refererUrl),则“这是页面的第一个请求
Dim方法为String=“OnResourceResponse()。”
Dim requestOverview As String=$“[{response.StatusCode}][{request.Url}”
Logger.Info($“{method}{requestOverview}”)
如果响应状态代码为200,则
Logger.Warn($“{method}{requestOverview}”)
如果结束
如果结束
返回MyBase.OnResourceResponse(浏览器控件、浏览器、帧、请求、响应)
端函数
末级

实现
IRequestHandler
,使用
IRequestHandler.OnResourceResponse
,您可以检查
响应.StatusCode
。如果您需要更多示例,请搜索项目源。@amaitland这很有效,谢谢!但我现在有一个不同的问题。当我打开带有初始url的页面时,ResourceResponse事件只为我触发一次。任何后续的加载调用(url)都不会触发该事件。原因可能是什么?不看代码很难说。如果您将您的
IRequestHandler
实现发布为
Gist
或类似内容,我可以看一看。这很简单。我只是从源代码中取了一个,删除了一些放在那里作为示例的位。现在开始:向
CefSharp.Example.RequestHandler
类添加
断点
,它将按预期触发。你能用这个例子重现你的问题吗(下载并编译源代码)?你用的是什么版本?