小编Phi*_*sse的帖子

如何强制Web浏览器不缓存图像

背景

我正在为两个无偿网站编写和使用一个非常简单的基于CGI(Perl)的内容管理工具.它为网站管理员提供HTML表单,用于填写字段(日期,地点,标题,描述,链接等)的事件并保存.在该表单上,我允许管理员上传与事件相关的图像.在显示表单的HTML页面上,我还显示了上传图片的预览(HTML img标签).

问题

当管理员想要更改图片时,会发生此问题.他只需点击"浏览"按钮,选择一张新照片然后按确定即可.这很好用.

上传图像后,我的后端CGI处理上传并正确地重新加载表单.

问题是显示的图像没有刷新.即使数据库保存正确的图像,仍会显示旧图像.我已将其缩小到图像在Web浏览器中缓存的事实.如果管理员点击Firefox /资源管理器/ Safari中的RELOAD按钮,则所有内容都会刷新,并且只会显示新图像.

我的解决方案 - 不工作

我试图通过写一个过去很远的日期的HTTP Expires指令来控制缓存.

Expires: Mon, 15 Sep 2003 1:00:00 GMT
Run Code Online (Sandbox Code Playgroud)

请记住,我在管理方面,我并不关心页面是否需要更长时间才能加载,因为它们总是过期.

但是,这也不起作用.

笔记

上传图像时,其文件名不会保留在数据库中.它被重命名为Image.jpg(在使用时简单地说出来).使用新图像替换现有图像时,名称也不会更改.只是图像文件的内容发生了变化.

网络服务器由托管服务/ ISP提供.它使用Apache.

有没有办法强制Web浏览器不缓存此页面中的内容,甚至图像?

我正在使用数据库实际"保存文件名"的选项.这样,如果图像被更改,IMG标签的src也将改变.但是,这需要在整个站点进行大量更改,如果我有更好的解决方案,我宁愿不这样做.此外,如果上传的新图像具有相同的名称(例如图像有点照片并重新上传),这仍然无效.

html caching image image-caching browser-cache

115
推荐指数
8
解决办法
19万
查看次数

如何查找Crystal Report rpt文件的版本?

我有一个旧版本的Crystal Report文件(遗憾的是我不知道,也无法轻易找到使用的版本),我需要对该RPT文件进行更改.我想找出哪个版本的RPT文件,以便我可以安装正确版本的编辑器.

如果我安装了所有新版本和最新版本,当我保存RPT文件时它告诉我原始文件来自旧版本(未指定哪个),并且保存会将其升级到最新格式,因此以前的版本该应用程序将无法使用它.那里帮助不大.

我还检查了Crystal Report周围的所有内容,找到了"属性"或"信息"窗口,但没有成功.

有没有办法知道RPT文件属于哪个版本?

version crystal-reports

11
推荐指数
1
解决办法
3万
查看次数

打电话给_freea真的有必要吗?

我正在使用DevStudio在Windows上开发,在C/C++中不受管理.

我想在堆栈而不是堆上分配一些内存,因为我不想处理手动释放内存(我知道智能指针和所有这些东西.我有一个非常具体的内存分配我需要的情况处理),类似于使用A2W()和W2A()宏.

_alloca就是这样做的,但它已弃用了.建议使用malloca代替.但_malloca文档说,每次调用_malloca都必须调用___freea.然后它失败了我使用_malloca的目的,我将使用malloc或new.

任何人都知道我是否可以逃避不泄漏_freea而内部的影响是什么?

否则,我最终只会使用已弃用的_alloca函数.

windows stack memory-management

8
推荐指数
1
解决办法
1588
查看次数

使用32位应用程序的64位驱动程序

我有一个Windows应用程序,它可以作为32位运行(由于我的控制之外的其他限制).但是,我的应用程序必须调用和访问可能是32位或64位的驱动程序,具体取决于安装它的系统.

我通过DeviceIoControl()调用访问驱动程序,交换在include文件中声明的数据结构.数据结构包含声明为"DWORD_PTR"的字段(我不控制的包含文件).

我的问题是在64位系统上,驱动程序期望结构包含64位整数(因为DWORD_PTR声明).但是,我的32位程序将那些DWORD_PTR视为32位整数.然后,我的数据结构的程序版本与驱动程序对这些结构的理解之间存在数据不匹配.

DeviceIoControl()以ERROR_INSUFFICIENT_BUFFER结束失败(传递给系统调用的数据区域太小).我确认如果我将64位版本的结构传递给驱动程序,我不会收到此错误.

我有一些丑陋的选择.但我想知道是否有人有更好的建议?


解:

  • 使用REAL 64位数据字段(__int64)声明共享结构的新副本
  • 动态检查OS体系结构(32/64)
  • 使用32位或64位版本的结构进行DeviceIoControl()调用.

缺点:

  • 我必须手动维护结构声明的显式64位副本.随着时间的推移可能会很痛苦.

我的其他解决方案是这个的变体,但它们总是涉及维护结构定义的一些副本(例如,在COML for COM服务器选项中).

编辑:这是一个Microsoft驱动程序,似乎它不使用IoIs32bitsProcess(irp)!

windows 64-bit winapi driver

3
推荐指数
1
解决办法
1979
查看次数

AWS SNS绕过API网关并直接调用Lamba函数

我偶然发现了一个相当奇怪的,据我所知,亚马逊SNS的无证行为.我正在寻找解决方案或设置来解决它.

摘要

我有一个SNS主题,其HTTPS订阅指向一个Amazon API Gateway REST端点,支持Node.js Lambda函数以执行请求.

现在,如果我在主题上使用SNS和发布,整个API网关映射模板将被忽略/短路.Lambda函数最终接收原始SNS JSON对象.

但是,如果我使用Web浏览器(或curl)访问端点,则会调用API网关映射转换,并将正确的JSON数据传递给Lambda函数.

API网关端点

API网关(以下称为TheApi)是使用sms"路径参数"下的资源创建的{phone}.因此,您可以https://TheApi/sms/111-222-3333使用a POSTGET方法进行查询.

这两种方法都有一个通用的映射模板,它可以获取所有路径参数,所有头参数,所有查询参数和整个请求体,并将其转换为一个LARGE请求体JSON对象.这是模板的样子:

{
    "resource-path" : "$context.resourcePath",
    "http-method" : "$context.httpMethod",
    "headers": {
    #foreach($param in $input.params().header.keySet())
      "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
    #end
    },
    "query": {
    #foreach($param in $input.params().querystring.keySet())
      "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
    #end
    },
    "paths": {
    #foreach($param in $input.params().path.keySet())
      "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end

    #end
    },
   "body" : $input.json('$')
}
Run Code Online (Sandbox Code Playgroud)

然后将得到的对象作为eventlambda函数运行的Lambda函数提供给Lambda函数.这是一个简单的API网关"测试"的结果:

Tue Feb 09 00:54:13 UTC …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-sns aws-lambda aws-api-gateway

3
推荐指数
1
解决办法
789
查看次数

从派生类中自动调用base.Dispose()

编辑 - 新问题

好的,让我们更一般地重新解释这个问题.

使用反射,有没有办法在运行时动态调用您可能重写的基类方法.您不能在编译时使用'base'关键字,因为您无法确定它是否存在.在运行时,我想列出我的祖先方法并调用祖先方法.

我尝试使用GetMethods()等,但他们返回的只是指向该方法派生程序最多的"指针".不是基类的实现.

背景

我们正在使用相对较大的类层次结构在C#3.0中开发一个系统.这些类中的一些类(在层次结构中的任何位置)具有需要处理的资源,这些类实现IDisposable接口.

问题

现在,为了便于维护和重构代码,我想找到一种方法,对于实现IDisposable的类,"自动"调用base.Dispose(bDisposing),如果任何祖先也实现了IDisposable.这样,如果层次结构中较高级别的某个类开始实现或停止实现将自动处理的IDisposable.

这个问题有两个方面.

  • 首先,查找是否有任何祖先实现IDisposable.
  • 其次,有条件地调用base.Dispose(bDisposing).

第一部分,找到实现IDisposable的祖先,我已经能够处理.

第二部分是棘手的.尽管我付出了很多努力,但我还是无法从派生类调用base.Dispose(bDisposing).我所有的尝试都失败了 它们要么导致编译错误,要么调用错误的Dispose()方法,这是最导出的方法,因此永远循环.

主要问题是,如果没有实现它的祖先这样的东西,你实际上不能直接在你的代码中引用base.Dispose()(请注意,可能没有祖先实现IDisposable,但我希望派生代码准备就绪,如果将来发生这样的事情).这给我们留下了反思机制,但我找不到合适的方法.我们的代码充满了先进的反射技术,我想我没有错过任何明显的东西.

我的解决方案

我最好的拍摄是在评论代码中使用一些条件代码.更改IDisposable层次结构将破坏构建(如果不存在IDisposable祖先)或抛出异常(如果存在IDisposable祖先但未调用base.Dispose).

这是我发布的一些代码,向您展示我的Dispose(bDisposing)方法的样子.我将此代码放在整个层次结构中所有Dispose()方法的末尾.任何新类都是从包含此代码的模板创建的.

public class MyOtherClassBase
{
    // ...
}


public class MyDerivedClass : MyOtherClassBase, ICalibrable
{

    private bool m_bDisposed = false;

    ~MyDerivedClass()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool bDisposing)
    {
        if (!m_bDisposed) {
            if (bDisposing) {
                // Dispose managed resources
            }
            // …
Run Code Online (Sandbox Code Playgroud)

c# reflection idisposable

2
推荐指数
1
解决办法
1万
查看次数