НЕВОЗМОЖНО УДАЛИТЬ. Неправильный подход к проблеме. Используйте пример, который дает сопровождающий кода
Все еще новичок в работе с проектом cefsharp.
Я пытаюсь привязать пользовательский агент к экземпляру, а не глобально.
В настоящее время я использую следующее в своем Program.cs
var settings = new CefSettings();
settings.CefCommandLineArgs.Add("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1");
Хотя это работает, он устанавливает пользовательский агент глобально. Я использую две формы, так как хочу, чтобы одна отображалась как мобильная, а другая — как настольная. При этом я не понимаю, как мне это сделать. Используя вышеизложенное, он устанавливает UserAgent глобально. Я ненавижу комментировать и раскомментировать строку, устанавливающую ее.
Я попробовал следующее
using CefSharp;
using CefSharp.Handler;
public class CustomRequestHandler : CefSharp.Handler.RequestHandler
{
protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
// Intercept only the specific URL
if (request.Url == "https://www.whatismybrowser.com/detect/what-is-my-user-agent")
{
request.SetHeaderByName("user-agent", "MyBrowser CefSharp Browser", true);
}
// Always return false to continue the navigation
return false;
}
}
Я думаю, что адаптировал его правильно, но теперь столкнулся с тем, что IRequest доступен только для чтения. Пробовал несколько других адаптаций, всегда сталкивался с проблемой «только для чтения».
Редактировать: Хорошо, я думаю, что здесь что-то есть.
using CefSharp;
using CefSharp.Handler;
using System;
using System.Collections.Specialized;
public class CustomRequestHandler : RequestHandler
{
protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
if (request.Url == "https://www.whatismybrowser.com/detect/what-is-my-user-agent")
{
try
{
// Log the interception of the URL
Console.WriteLine("Intercepted URL: " + request.Url);
// Create a dictionary to hold the modified headers
var modifiedHeaders = new NameValueCollection(request.Headers);
// Modify the user agent
modifiedHeaders["user-agent"] = "MyBrowser CefSharp Browser";
// Create a new request with the modified headers
var modifiedRequest = frame.CreateRequest();
modifiedRequest.Url = request.Url;
modifiedRequest.Method = request.Method;
modifiedRequest.Headers = modifiedHeaders;
// Copy post data if it exists
if (request.PostData != null)
{
modifiedRequest.PostData = request.PostData;
}
// Load the modified request using the browser
frame.LoadRequest(modifiedRequest);
// Log successful loading of the modified request
Console.WriteLine("Modified request loaded successfully.");
return true; // Cancel the original request
}
catch (Exception ex)
{
// Log any exceptions for debugging purposes
Console.WriteLine("Exception occurred: " + ex.Message);
}
}
return false; // Continue with the original request
}
}
С помощью этого кода он фактически не загружает тестовый URL-адрес, но загружает другие URL-адреса. Так что на самом деле это обработка тестового URL-адреса. Страница просто не загружается. И это всего лишь перехват мобильного браузера, как и предполагалось. Перехваченный URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent Измененный запрос успешно загружен.
С этим последним кодом, который, кажется, перехватывает URL-адрес и использует мой обработчик, мне пришлось выполнить некоторую регистрацию, чтобы получить это
OnBeforeBrowse URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent
Intercepted URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent
Modified request loaded successfully.
Load Error: Aborted, ERR_ABORTED, https://www.whatismybrowser.com/detect/what-is-my-user-agent
Loading State Changed: False
[14956:7864:0710/043123.774:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213
GetResourceRequestHandler: https://csm.us5.us.criteo.net/iev?entry=c~Gum.ChromeSyncframe.CookieRead.uid~1&entry=c~Gum.ChromeSyncframe.FragmentData.onetag.Bundle.Origin.undefined~1&entry=c~Gum.ChromeSyncframe.SidReadSuccess~1&entry=h~Gum.ChromeSyncframe.SidReadSuccessDuration~328
Render process terminated: ProcessCrashed
[8352:10124:0710/040922.537:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213
[8352:10124:0710/040922.538:VERBOSE1:browser_info_manager.cc(531)] frame 6-BB0DCBA5339448D1441249D75553904F, pdf_process=0, browser_process_guest=0, print_preview_dialog=0, main=1
[8352:10124:0710/040922.542:VERBOSE1:frame_host_impl.cc(515)] frame A-F5DF7D801E84FDC36BCC535A08C6FD9B (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)
[8352:10124:0710/040922.543:VERBOSE1:frame_host_impl.cc(515)] frame 9-870ABD8F28E33A0A82F7D99F90C14289 (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)
[18420:11048:0710/040922.543:VERBOSE1:network_delegate.cc(35)] NetworkDelegate::NotifyBeforeURLRequest: https://csm.us5.us.criteo.net/iev?entry=c~Gum.ChromeSyncframe.CookieRead.uid~1&entry=c~Gum.ChromeSyncframe.FragmentData.onetag.Bundle.Origin.undefined~1&entry=c~Gum.ChromeSyncframe.SidReadSuccess~1&entry=h~Gum.ChromeSyncframe.SidReadSuccessDuration~676
[8352:10124:0710/040922.544:VERBOSE1:frame_host_impl.cc(515)] frame 8-A5EA056889DFBED6602D2F909E9971D4 (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)
При использовании командной строки Disable-site-isolation-trials страница по-прежнему не загружается, и браузер находится в состоянии постоянного обновления страницы в бесконечном цикле.
Эти методы не работают для того, что я ищу, поскольку я пытаюсь открыть две формы, одна из которых сообщает как мобильный браузер, а другая - как настольный браузер одновременно. Мне нужно установить пользовательский агент для экземпляра не глобально.
@amaitland Не поймите меня неправильно, я использую первый метод, чтобы установить пользовательский агент. Проблема в том, что мне приходится постоянно комментировать строку, которая устанавливает пользовательский агент при компиляции. Просто если бы я мог прикрепить пользовательский агент к экземпляру ChromiumWebBrowser вместо того, чтобы устанавливать его глобально, это решило бы мою проблему.
SetUserAgentOverrideAsync — единственный способ полностью зарядить пользовательский агент во время выполнения. Изменение заголовка запроса не приведет к изменению пользовательского агента в JavaScript. Создайте другой контекст запроса для каждого браузера, а затем вызовите SetUserAgentOverrideAsync.
Хорошо, я не знаю, почему у меня было так много проблем. Может быть, я просто еще учусь и не совсем понимаю, что делаю. ВИНОВАТ. Ничто из того, что я изначально пробовал, не было НЕПРАВИЛЬНЫМ. Я не могу удалить эту тему.
Это решение, на которое намекал Амайтланд, сработало.
// Copyright © 2020 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
namespace CefSharp.MinimalExample.WinForms
{
public class LifeSpanHandler : ILifeSpanHandler
{
bool ILifeSpanHandler.DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
return false;
}
void ILifeSpanHandler.OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
using (var client = chromiumWebBrowser.GetDevToolsClient())
{
_ = client.Network.SetUserAgentOverrideAsync("Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1");
}
}
void ILifeSpanHandler.OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
}
bool ILifeSpanHandler.OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
{
newBrowser = null;
return false;
}
}
}
browser.LifeSpanHandler = new LifeSpanHandler();
Приведенный выше код является ТОЧНЫМ КОДОМ ИЗ МОЕЙ ФОРМЫ/КОДА, но он точно такой же, как и у сопровождающего кода в их ссылке. Лично я считаю, что лучше использовать ссылку, которую сопровождающий кода лучше, чем копировать/вставлять сюда. На самом деле вопрос следует полностью удалить, потому что я не знал, что делаю, а ответ дал специалист по сопровождению кода. На самом деле, ни один код в моем исходном вопросе не является действительным, как заявил специалист по сопровождению кода. Вопрос в том, чтобы больше запутать людей, чем отвечать на любые вопросы. Невозможно удалить
Зачем голосовать за ответ. Имейте в виду, это ответ на вопрос, который я задал и на который ответил. Кто знает, какое решение работает лучше, чем тот, кто задал вопрос. Так что давай, проголосуй против совершенно нормального ответа.
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из отзыва
См. github.com/cefsharp/CefSharp/wiki/General-Usage#useragent