Wpf 如何在CefSharp中确定来自服务器的响应是404?
我正在为CefSharp使用WPF控件。我需要知道我发出的请求何时收到http状态码404的响应Wpf 如何在CefSharp中确定来自服务器的响应是404?,wpf,cefsharp,Wpf,Cefsharp,我正在为CefSharp使用WPF控件。我需要知道我发出的请求何时收到http状态码404的响应 我注意到CefSharp有LoadError事件,但只有当域无法完全解析时才会触发(即,如果我访问www.sdfhjkhajsdf.com)。当域存在时,它不起作用,但您请求的页面不起作用。这是一个相当老的问题。CefSharp有很多很棒的更新,所以我希望这能帮助像我这样的搜索者。不要因为我的代码片段在VB.NET中而恨我 这就是我所做的记录任何不是200响应的事情。对于我的应用程序,我打开了请求页
我注意到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
类添加断点
,它将按预期触发。你能用这个例子重现你的问题吗(下载并编译源代码)?你用的是什么版本?