我正在评估 CefSharp 来构建一个基本上只包装 Web 应用程序的桌面应用程序。要从文件系统访问文件,我想拦截 Web 应用程序的 http 请求。
我改编了最小示例并安装了一个
CustomRequestHandler
,它覆盖了GetResourceRequestHandler
,就像文档中针对请求拦截所做的那样。
现在,我想回答来自网络应用程序的 HEAD 请求(该应用程序需要从文件末尾读取一个块 - 所以我首先需要总大小)。但到目前为止我还没有找到方便的方法。
我尝试了以下方法:
protected override IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
if (request.Method == "HEAD")
{
var handler = ResourceHandler.FromStream(Stream.Null, mimeType: "application/octet-stream");
var total = new System.IO.FileInfo(_filename).Length;
handler.Headers.Set("Content-Length", $"{total}");
return handler;
}
return ResourceHandler.ForErrorMessage("Method not allowed", HttpStatusCode.MethodNotAllowed);
}
在浏览器中,Content-Length 标头设置为零(对于零长度流来说是正确的)。至于现在,我想我需要实现一个自定义的 ResourceHandler ,它允许设置 Content-Length 标头。但我想知道在发送实际响应之前,标头是否已进一步“更正”。任何提示表示赞赏。
显然我忽略了显而易见的事情。我只需要设置属性
ResponseLength
,而不是编写标题。该方法现在看起来像这样:
protected override IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
if (request.Method == "HEAD")
{
var handler = ResourceHandler.FromStream(Stream.Null, mimeType: "application/octet-stream");
var total = new System.IO.FileInfo(_filename).Length;
handler.ResponseLength = total;
return handler;
}
return ResourceHandler.ForErrorMessage("Method not allowed", HttpStatusCode.MethodNotAllowed);
}