在CefSharp中,我需要将所有资源/文件请求从一个域(例如fileserver.com
)重定向到另一个域(例如myfileserver.com
),该域有时会进行一些修改以镜像相同的文件(例如更改的graphics / .png文件)。
我尝试用IRequestHandler
实现一个OnBeforeResourceLoad
,它将检查并转发所有从fileserver.com
到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
用于Flash游戏,我认为它不能处理此类问题。正确重定向,因为它仍然希望从真实URL中获取文件,并且由于从URL中取消了原始URL,因此导致fileserver.com
或myfileserver.com
中没有文件/图形被加载到Flash游戏中。重定向。
因此,我认为我必须执行重定向/覆盖fileserver.com
请求的资源,而无需进行实际的URL更改。
作为替代方案,我一直试图将IResponseFilter
与IResponseFilter.Filter
一起使用以直接覆盖文件[bytes?]而不是重定向。但是,我完全不知道该怎么做。
这里有一些伪代码,说明我如何想象它会如何工作(我现在在磁盘上有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 in CefSharp repo那里得到了这个主意,因为我找不到其他方法来尝试不进行URL重定向而覆盖文件,但是不知道如何使其读取我的本地文件并在请求的文件上写入文件)
我的另一个想法是让myfileserver.com
假装实际上是fileserver.com
,但认为不可能。
我没有尝试像这样读取/写入内存的经验,所以我不知道该怎么办。谢谢您的帮助或反馈。