Jac*_*ack 6 c# winforms custom-headers chromium-embedded cefsharp
或者如何在新建ChromiumWebBrowser实例时将自定义标头注入到站点的初始请求中.
我是Chromium的菜鸟,可以真正使用一些帮助.我有一个带CEF窗口的winforms应用程序.K,到目前为止没有问题.我需要做的是使用包含身份验证信息的自定义http-header调用/加载初始URL.这可能吗?
以下基本上是正在发挥作用的所有部分工作,除了自定义标题(Doh!)
Winform(CEF httpRequest(带有自定义标头))[永远不会超过这一点] => C#MVC web app => Owin_Authentication_Pipeline segment => MVC响应,带有填充的Razor视图=>显示在Winform Chromium应用程序中.
也许这也会有所帮助:
using CefSharp;
using CefSharp.WinForms;
...
private void Form1_Load(object sender, EventArgs e)
{
Cef.Initialize();
ChromiumWebBrowser myBrowser = new ChromiumWebBrowser("whatever.com");
// ??How do i get a custom header be sent with the above line??
myBrowser.Dock = DockStyle.Fill;
//myBrowser.ShowDevTools();
//myBrowser.RequestHandler = new DSRequestHander();
//myBrowser.FrameLoadStart += myBrowser_FrameLoadStart;
this.Controls.Add(myBrowser);
}
Run Code Online (Sandbox Code Playgroud)
我把它弄死了,看了看,尝试了我工具箱中的所有技巧,然后是一些.
我非常感谢任何想法,帮助或暗示我如何能够解决或绕过这个boggler.提前致谢.
实施和分配75.你应该遵循的方法75,一个基本的例子应该是这样的
public class CustomResourceRequestHandler : ResourceRequestHandler
{
protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
var headers = request.Headers;
headers["User-Agent"] = "My User Agent";
request.Headers = headers;
return CefReturnValue.Continue;
}
}
public class CustomRequestHandler : RequestHandler
{
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
return new CustomResourceRequestHandler();
}
}
browser.RequestHandler = new CustomRequestHandler();
Run Code Online (Sandbox Code Playgroud)
目前,您必须阅读headers属性,进行更改然后重新分配.
您应该创建一个实现的类,IRequestHandler然后RequestHandler在浏览器对象中设置该类的实例.
对于版本53,该类应如下所示:
class ChromeBrowserRequestHandler: IRequestHandler
{
public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
return false;
}
public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
{
return false;
}
public bool OnBeforePluginLoad(IWebBrowser browser, string url, string policyUrl, WebPluginInfo info)
{
return false;
}
public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
var headers = request.Headers;
headers["Custom-Header"] = "My Custom Header";
request.Headers = headers;
return CefReturnValue.Continue;
}
public bool OnCertificateError(IWebBrowser browser, CefErrorCode errorCode, string requestUrl)
{
return false;
}
public void OnPluginCrashed(IWebBrowser browser, string pluginPath)
{
}
public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
{
}
public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return null;
}
public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
return false;
}
public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}
public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
{
}
public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
{
return false;
}
public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
return false;
}
public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
{
}
public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
}
public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl)
{
}
public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在创建浏览器对象时:
ChromiumWebBrowser myBrowser = new ChromiumWebBrowser("whatever.com")
{
RequestHandler = new ChromeBrowserRequestHandler()
};
Run Code Online (Sandbox Code Playgroud)
请注意,必须在加载页面之前设置请求处理程序.如果您无法在instanctiaction期间设置请求处理程序,您仍可以稍后设置它重新加载页面myBrowser.Load("whatever.com").
小智 5
在最新的版本中的一个部分回调已经从移动IRequestHandler到 IResourceRequestHandler界面。最简单的方法是覆盖默认实现RequestHandler& ResourceRequestHandler,例如:
class BearerAuthResourceRequestHandler : ResourceRequestHandler
{
public BearerAuthResourceRequestHandler(string token)
{
_token = token;
}
private string _token;
protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
if (!string.IsNullOrEmpty(_token))
{
var headers = request.Headers;
headers["Authorization"] = $"Bearer {_token}";
request.Headers = headers;
return CefReturnValue.Continue;
}
else return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
}
}
class BearerAuthRequestHandler : RequestHandler
{
public BearerAuthRequestHandler(string token)
{
_token = token;
}
private string _token;
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
if (!string.IsNullOrEmpty(_token)) return new BearerAuthResourceRequestHandler(_token);
else return base.GetResourceRequestHandler(chromiumWebBrowser, browser, frame, request, isNavigation, isDownload, requestInitiator, ref disableDefaultHandling);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,将其分配给 browser RequestHandler:
Browser.RequestHandler = new BearerAuthRequestHandler(token);
Run Code Online (Sandbox Code Playgroud)