[英]Proxy for only one browser with CefSharp Offscreen
我正在嘗試為ChromiumWebBrowser()
設置代理,而不更改其他瀏覽器的設置。
我的代碼如下所示:
CEF初始化
在這里,我將初始化CefSharp並調用將測試以設置代理的方法
public CFTryOut()
{
var settings = new CefSettings()
{
CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache"),
};
CefSharpSettings.ShutdownOnExit = true;
Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
ProxyTest();
}
代理測試
在這里,我想創建兩個ChromiumWebBrowser()
並將代理設置為僅其中之一
async Task ProxyTest()
{
ChromiumWebBrowser firstbrowser = new ChromiumWebBrowser();
ChromiumWebBrowser secondbrowser = new ChromiumWebBrowser();
waitini:
if (!firstbrowser.IsBrowserInitialized && !secondbrowser.IsBrowserInitialized)
{
Thread.Sleep(100);
goto waitini;
}
firstbrowser.LoadingStateChanged += FirstBrowserLoadingStateChanged;
secondbrowser.LoadingStateChanged += SecondBrowserLoadingStateChanged;
OpenSync("http://icanhazip.com/", firstbrowser);
string x = await firstbrowser.GetBrowser().MainFrame.GetSourceAsync();
//Set the Proxy
await Cef.UIThreadTaskFactory.StartNew(delegate
{
var rc = firstbrowser.GetBrowser().GetHost().RequestContext;
var v = new Dictionary<string, object>();
v["mode"] = "fixed_servers";
v["server"] = "http://45.77.248.104:8888";
string error;
bool success = rc.SetPreference("proxy", v, out error);
});
OpenSync("http://icanhazip.com/", firstbrowser);
string y = await firstbrowser.GetBrowser().MainFrame.GetSourceAsync();
OpenSync("http://icanhazip.com/", secondbrowser);
string z = await secondbrowser.GetBrowser().MainFrame.GetSourceAsync();
}
在這里, First/SecondBrowserLoadingStateChanged
允許我在頁面加載完成時進行標記,以便OpenSync
在返回之前等待頁面加載結束:
public void OpenSync(string url, ChromiumWebBrowser browser)
{
IsLoading = true;
browser.Load(url);
SpinWait.SpinUntil(() => !IsLoading);
}
我期望什么
x =我的IP-xx.xx.xx.xx
y =代理的IP-45.77.248.104
z =我的IP-xx.xx.xx.xx
我得到了什么
x =我的IP-xx.xx.xx.xx
y =代理的IP-45.77.248.104
z =代理的IP-45.77.248.104
問題是我沒有在第二secondbrowser
上設置任何代理,但是請求通過了代理。 我猜那是因為它們共享同一主機。
所以
1)如何為每個ChromiumWebBrowser
指定專用代理?
要么
2)如何為每個新的ChromiumWebBrowser
指定不同的主機?
感謝@amaitland,這實際上非常容易。
我的問題是我試圖在瀏覽器初始化后設置RequestContext,但它是只讀的。
但是可以將其作為參數傳遞給構造函數:
var rc1 = new RequestContext();
ChromiumWebBrowser firstbrowser = new ChromiumWebBrowser("", null, rc1);
var rc2 = new RequestContext();
ChromiumWebBrowser secondbrowser = new ChromiumWebBrowser("", null, rc2);
全部歸功於Amaitland
對於一種更可重用的方式,可以像這樣逐出設置代理的過程:
async private Task SetProxy(ChromiumWebBrowser cwb, string Address)
{
await Cef.UIThreadTaskFactory.StartNew(delegate
{
var rc = cwb.GetBrowser().GetHost().RequestContext;
var v = new Dictionary<string, object>();
v["mode"] = "fixed_servers";
v["server"] = Address;
string error;
bool success = rc.SetPreference("proxy", v, out error);
});
}
然后我可以打電話給:
SetProxy(firstbrowser, "123.123.123.123:1234")
沒錯,但是使用(“ asyn”)時請記住
async private Task SetProxy(ChromiumWebBrowser cwb, string Address)
{
await Cef.UIThreadTaskFactory.StartNew(delegate
{
var rc = cwb.GetBrowser().GetHost().RequestContext;
var v = new Dictionary<string, object>();
v["mode"] = "fixed_servers";
v["server"] = Address;
string error;
bool success = rc.SetPreference("proxy", v, out error);
});
}
樣品使用:
public async void dd1()
{
await SetProxy(firstbrowser, "123.123.123.123:1234")
}
/完美模式開啟
using System.Threading.Tasks;
using System.Collections.Generic;
using CefSharp;
namespace Extensions
{
public static class WebBrowserExtensions
{
public static Task SetProxy(this IWebBrowser webBrowser, string address)
{
return Cef.UIThreadTaskFactory.StartNew(() =>
{
var context = webBrowser.GetBrowser().GetHost().RequestContext;
context.SetPreference("proxy", new Dictionary<string, object>
{
["mode"] = "fixed_servers",
["server"] = address
}, out _);
});
}
}
}
用法:
await browser.SetProxy("111.111.111.111:1111")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.