Перенаправление / перезапись запроса ресурса без изменения фактического URL-адреса файла в CefSharp

#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