#c# #cefsharp
#c# #cefsharp
Вопрос:
В CefSharp мне нужно перенаправить все запросы ресурсов / файлов из домена (например fileserver.com
) в другой домен (например myfileserver.com
, который будет отражать одни и те же файлы, иногда с небольшими изменениями (например, измененные графические / .png файлы).
Я попытался реализовать IRequestHandler
, с OnBeforeResourceLoad
помощью которого вместо этого проверял и перенаправлял все запросы ресурсов, отправляемые на fileserver.com
to myfileserver.com
. Например:
public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
string originalUrl = request.Url;
if (request.Url.contains("http://fileserver.com"))
{
Console.WriteLine("fileserver.com: " request.Url);
string filename = GetFileName(request.Url);
// e.g. http://fileserver.com/abc.png = abc.png
// We want to use the files from myfileserver.com instead
request.Url = "http://myfileserver.com/" filename;
}
callback.Dispose();
return CefReturnValue.Continue;
}
Теперь приведенный выше код должен работать (работает с использованием HTML- img
тега), проблема в том, что он fileserver.com
используется для флеш-игры, и я не думаю, что он правильно обрабатывает такого рода перенаправление, поскольку он по-прежнему ожидает получения файла с реального URL, и это приводит к отсутствию файлов / графики изили fileserver.com
myfileserver.com
для загрузки во флеш-игру, поскольку исходный URL-адрес был удален из перенаправления.
Итак, я думаю, мне пришлось бы сделать это перенаправление / перезапись fileserver.com
запрошенного ресурса без фактического изменения URL.
В качестве альтернативы я пытался IResponseFilter
IResponseFilter.Filter
напрямую перезаписать файл [байты?] вместо перенаправления. Однако я полностью запутался в том, как это сделать.
Вот некоторый псевдокод о том, как я представлял, что это будет работать (вместо этого у меня есть myfileserver.com
файлы на моем диске):
FilterStatus IResponseFilter.Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
{
// For example, fileserver.com has requested file abc.png
// Read bytes from my local version of the file from fileserver.com
byte[] myLocalFileBytes = File.ReadAllBytes("myfileserver\abc.png"); // name of requested file, not very sure how to retrieve this here
// Write my file to the requested file from fileserver.com to replace it
memoryStream.Write(myLocalFileBytes, 0, myLocalFileBytes.Length);
// This is obviously completely wrong and probably even the wrong place, sorry!
return FilterStatus.Done;
}
(Я получил эту идею из filter в репозитории CefSharp, поскольку я не смог найти никаких других методов, чтобы попытаться перезаписать файл без перенаправления URL, но понятия не имею, как заставить его прочитать мой локальный файл и записать его поверх запрошенного файла)
Моя другая идея — сделать myfileserver.com
вид, что это на самом деле fileserver.com
, но не думаю, что это возможно.
У меня нет опыта попыток чтения / записи памяти подобным образом, поэтому я понятия не имею, что делать. Я был бы признателен за любую помощь или отзывы, спасибо.
Комментарии:
1.
ResourceFilter
на самом деле это не лучший подход здесь. Вам лучше использоватьISchemeHandlerFactory
, см. github.com/cefsharp/CefSharp/wiki /… для предыстории. Зарегистрируйте свою фабрику дляhttp
илиhttps
в зависимости от того, что имеет значение, укажитеdomain
, чтобы вы получали только запросы, затем вы можете прокси-вызовы для вашего нового домена, см. github.com/cefsharp/CefSharp/blob/cefsharp/73/CefSharp.Example /… для примера, который может быть адаптирован.2. @amaitland я реализовал
FlashResourceHandler
, и, похоже, это работает! Однако возможно ли использовать локальный файл вместоWebRequest.Create
загрузки моей версии файла. Спасибо.3. Да, либо измените приведенный мной пример, либо используйте один из статических вспомогательных методов, предоставляемых реализацией по умолчанию в cefsharp.github.io/api/71.0.0/html /…
4. Начните с
ResourceHandler.FromFilePath