将资源复制到Web响应时,为什么会出现访问冲突?

Jer*_*dge 2 delphi web-applications stream embedded-resource

在这里按照教程了解如何在EXE中包含文件.虽然我成功地编译了PNG图像,但在使用它时,我没有成功.

MyResources.rc

LOGO_PNG RCDATA Resources\Logo.png
Run Code Online (Sandbox Code Playgroud)

MyConsoleUnit.pas

const
  RES_LOGO_PNG = 'LOGO_PNG';

implementation

{$R *.dfm}
{$R 'MyResources.res' 'MyResources.rc'}
Run Code Online (Sandbox Code Playgroud)

现在,这对我来说有点混乱.我必须处理所有流,没有文件.我已将此PNG图像嵌入此Logo.png资源,以便在/Logo.png从Web服务器请求时作为内容(作为流)传回.我还遵循了一个非常基本的教程:

procedure TMyWebConsole.MyWebConsoleLogoAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  RS: TResourceStream;
begin
  RS := TResourceStream.Create(HInstance, RES_LOGO_PNG, RT_RCDATA);
  try
    Response.ContentType:= 'image/png';
    RS.SaveToStream(Response.ContentStream);
  finally
    RS.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

问题是,当调用此函数时(at SaveToStream),我得到访问冲突.客户端上的Web浏览器接收与"PNG文件"的内容相同的错误消息.

AV

那为什么要这样做呢?我究竟做错了什么?

Rob*_*edy 6

您正在访问空指针.它可能是Response.ContentStream,你应该分配的属性,而不是读取.文档说明了这一点:

注意:如果ContentStream属性的值不是nil,则忽略Content属性.

这表明ContentStream可能是零.因此,如果要使用它,则需要为其分配值:

Response.ContentStream := TResourceStream.Create(HInstance, RES_LOGO_PNG, RT_RCDATA);
Run Code Online (Sandbox Code Playgroud)

文档进一步解释:

如果您使用ContentStream属性,请不要自己释放流.Web响应对象会自动为您释放它.