如何覆盖/更新当前由 IIS 提供服务的文件?

2024-05-04

问题:

我的公司每月发布一份时事通讯,我将其托管在我们的内部网站上。我有一个供时事通讯作者上传最新版本的页面。作者上传最新的新闻通讯后,他会发送一封广播电子邮件来宣布新的新闻通讯。员工总是会检查新的时事通讯并向作者发送反馈以及需要进行的更正。

一旦作者进行了必要的更正(通常在发送广播电子邮件后一小时内),他就会重新访问我的页面并用更新的新闻通讯替换最新版本。

在更换(或更新,如果您愿意的话)新闻通讯后,任何试图访问它的人都会立即收到 500 - 内部服务器错误。

我的维护服务器的 IT 人员由于权限错误而无法删除/重命名/移动该文件,并且必须做很多复杂的事情才能删除该文件(一旦文件被删除,时事通讯的作者就可以重新 -上传更正后的副本,效果很好。

我和我的 IT 人员非常确定问题源于我试图在 IIS 主动向用户提供文件时替换该文件(我想到并认为我已编写代码以防止发生这种情况)。

运行替换的代码如下:

Protected Sub ReplaceLatestNewsletter()
    Dim dr As DataRow
    Dim sFile As String
    Dim mFileLock As Mutex

    Try
        If Me.Archives.Rows.Count > 0 Then
            dr = Me.Archives.Rows(0)
            sFile = dr("File").ToString

            If dr("Path").ToString.Length > 0 Then
                mFileLock = New Mutex(True, "MyMutexToPreventReadsOnOverwrite")

                Try
                    mFileLock.WaitOne()
                    System.IO.File.Delete(dr("Path").ToString)
                Catch ex As Exception
                    lblErrs.Text = ex.ToString
                Finally
                    mFileLock.ReleaseMutex()
                End Try
            End If

            fuNewsletter.PostedFile.SaveAs(Server.MapPath("~/Newsletter/archives/" & sFile))
        End If
    Catch ex As Exception
        lblErrs.Text = ex.ToString
    End Try

    dr = Nothing
    sFile = Nothing
    mFileLock = Nothing
End Sub

我以为Mutex会解决这个问题(尽管在重新阅读文档后,我不确定我是否真的可以像我尝试的那样使用它)。对上面代码的其他评论:

  • Me.Archives is a DataTable存储在ViewState
  • dr("File").ToString是文件名(无路径)
  • dr("Path").ToString是完整的本地计算机路径和文件名(即“C:\App_Root\Newsletters\archives\20120214.pdf”)
  • 新闻通讯的文件名设置为“YYYYMMDD.pdf”,其中 YYYYMMDD 是上传日期(格式化)。

无论如何,我很确定上面的代码是not对文件建立独占锁,以便可以安全地覆盖文件。

最终,我想确保发生以下情况:

  1. 如果 IIS 当前正在提供该文件,请等待 IIS 完成提供该文件。
  2. 在 IIS 再次为该文件提供服务之前,请在该文件上建立独占锁,以便其他进程、线程、用户(等)无法读取或写入该文件。
  3. 要么完全删除该文件并写入一个新文件来替换它,要么用新内容覆盖现有文件。
  4. 删除排他锁,以便用户可以再次访问该文件。

建议?

另外,我可以使用Mutex获得 Windows 文件系统中文件的互斥锁?

预先感谢您的帮助和建议。

EDIT:

新闻通讯链接的生成方式基于物理文件名。使用的方法是:

  1. 获取“archives”目录下的所有PDF文件。对于每个文件:
  2. 从文件名中解析发布日期。
  3. 将日期、文件路径、文件名和每个文件的 URL 存储在DataRow in a DataTable
  4. 排序DataTable按日期(降序)。
  5. 输出第一行作为当前问题。
  6. 将所有后续行输出为按年和月组织的“档案”。

UPDATE:

我无法辨别该文件的所有现有请求何时完成,而是仔细查看了 @Justin 答案的第一部分(“只有当从文件读取的进程也获得相同的互斥锁。”)

这让我配置 IIS7 通过 ASP.NET 运行时服务器静态内容 https://stackoverflow.com/questions/2593932/configure-iis7-to-server-static-content-through-asp-net-runtime以及已接受答案中的链接文章。

为此,我为所有 PDF 文件实现了一个处理程序,它实现了New Mutex(True, "MyMutexToPreventReadsOnOverwrite")确保在任何给定时间只有一个线程正在处理 PDF。

谢谢你的回答,@Justin。虽然我最终没有使用您建议的实现,但您的回答向我指出了一个可以接受的解决方案。


仅当从文件读取的进程也获得相同的互斥体时,您的互斥体才会起作用。提供文件的方法是什么?是使用 ASP.Net 还是这只是一个静态文件?

我的工作流程会有点不同:

  1. 将新的新闻通讯写给new file
  2. 让 IIS 开始为给定的 Newsletter url 提供新文件而不是旧文件
  3. 对该文件的所有现有请求完成后删除旧文件

这不需要锁定,也意味着我们不需要等待当前文件的请求完成(如果人们继续发出新请求,这可能会花费无限的时间)。唯一有趣的一点是步骤 2,这取决于文件的服务方式 - 最简单的方法可能是设置 HTTP 重定向或使用 URL 重写

HTTP 重定向

HTTP 重定向是服务器告诉客户端在收到对给定资源的请求时查看不同位置的位置,以便浏览器 URL 自动更新以匹配新位置。例如,如果用户请求http://server/20120221.pdf然后它们可以自动重定向到另一个 URL,例如http://server/20120221_v2.pdf(浏览器中显示的 URL 会改变,但他们需要输入的 URL 不会改变)。

您可以在 IIS 7 中使用以下命令执行此操作httpRedirect http://www.iis.net/ConfigReference/system.webServer/httpRedirect配置元素,例如:

<configuration>
   <system.webServer>
      <httpRedirect enabled="true" exactDestination="true" httpResponseStatus="Found">
         <!-- Note that I needed to add a * in for IIS to accept the wildcard even though it isn't used in this case -->
         <add wildcard="*20120221.pdf" destination="20120221_v2.pdf" />
      </httpRedirect>
   </system.webServer>
</configuration>

链接页面显示了如何从 ASP.Net 更改这些设置

网址重写

或者,可以将 IIS 设置为自动为给定 URL 提供不同文件的内容,而客户端(浏览器)永远不会知道其中的差异。这称为 URL 重写,可以在 IIS 中使用类似的方法来完成this http://www.iis.net/download/urlrewrite但是,它确实需要在 IIS 上安装其他组件才能工作。

使用 HTTP 重定向可能是最简单的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何覆盖/更新当前由 IIS 提供服务的文件? 的相关文章

  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • oracle ExecuteNonQuery 在 ASP.Net 上冻结

    我正在尝试使用 ASP C 和 CLR 4 5 中的 Oracle 连接来运行非查询 这是我的代码 string connectionString ConfigurationManager ConnectionStrings OracleC
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 在不运行控制台命令的情况下清理缓存的最佳方法是什么?

    在我的项目的管理面板中 我编写了更改要使用的数据库名称的功能 我把新的数据库名称写在parameters ini 之后必须清理缓存才能加载新配置 在不运行控制台命令的情况下清理缓存的最佳方法是什么 或者是否有另一种最佳实践如何更改当前数据库
  • 模糊不起作用 - Angular 2

    我试图在角度 2 中设置一个蓝色事件 如下所示 div class form group 组件 ts import Component ViewChild ElementRef Output EventEmitter from angula
  • 尝试划分数据时出现除零错误

    这是我的代码 SELECT CASHIER ID AS SERVER CONVERT VARCHAR 10 DATETIME 111 AS DATE SUM GRAND TOTAL AS TOTAL SALES SUM NUM PEOPLE
  • 如何通过单击按钮从反应状态挂钩数组中删除对象

    我正在尝试制作一个按钮 根据传递的索引从数组 即状态 中删除一个对象 我已经尝试了很多 但我的方法都不起作用 所以这是代码 希望我可以找人帮忙 state const items setItems useState name quantit
  • 即使在顶点着色器中使用,glGetUniformLocation()也会返回-1

    我正在尝试用法线渲染一个简单的立方体 我使用以下代码来初始化着色器 void initShader const char vertexShaderPath const char fragmentShaderPath cout lt lt I
  • 如何使用反射确定属性类型?

    如何测试类型的属性以查看它是否是指定类型 编辑 我的目标是检查程序集以查看该程序集中的任何类型是否包含 MyType 或从 MyType 继承 的属性 这是我走过的路 AssemblyName n new AssemblyName n Co
  • 我怎样才能找到圆的所有点? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定半径和圆心坐标 如何找到圆的所有
  • 是否可以保证枚举的 ToString 的值?

    我当前使用的数据库有一个 varchar 字段 在我的代码中 我想将潜在值映射到枚举 例如 public enum UserStatus Anonymous Enrolled SuperUser 在该列的数据库级别 它有一个限制 其值必须是
  • Python列表切片效率

    在下面的代码中 def listSum alist Get sum of numbers in a list recursively sum 0 if len alist 1 return alist 0 else return alist
  • 如何使用 ng-pattern 验证 angularJs 中的电子邮件 ID

    我正在尝试使用 ng pattern 指令验证 angularJs 中的电子邮件 id 字段 但我是 AngularJs 的新手 我需要在用户输入错误的电子邮件 ID 后立即显示错误消息 我下面的代码正在尝试解决 帮助我使用 ng patt
  • 如何对德语文本进行词形还原?

    我有一篇德语文本 我想对其应用词形还原 如果不可能进行词形还原 那么我也可以接受词干提取 Data 这是我的德语文本 mails Hallo Ich spielte am fr hen Morgen und ging dann zu ein
  • 在自引用表中查询父项和子项

    我有一个Comments如下表所示 在MySQL content created at id parent id second comment 2014 06 03T10 08 44 0000 37 1 third comment 2014
  • 按降序对数字进行排序

    我有 20 个文本框 每个都包含一个特定的数字 我希望 textbox1 到 textboxN 的数字按降序排列 如果任何文本框的值为零 那么我想保留该文本框不变 需要 vb net 中的示例代码 用于按降序对元素进行排序 dim arra
  • Pandas 滚动 std 会产生不一致的结果并且与 value.std 不同

    使用 pandas v1 0 1 和 numpy 1 18 1 我想计算时间序列上不同窗口大小的滚动平均值和标准差 在我正在处理的数据中 某些后续点的值可以是恒定的 这样 根据窗口大小 滚动平均值可能等于窗口中的所有值 并且相应的 std
  • Tensorflow:从 TFRecords 文件中提取图像和标签

    我有一个 TFRecords 文件 其中包含图像及其标签 名称 大小等 我的目标是将标签和图像提取为 numpy 数组 我执行以下操作来加载文件 def extract fn data record features Extract fea
  • 在多分支管道中授予复制 artIfact 权限

    我有以下设置 通过配置的 Jenkins 多分支管道作业Jenkinsfile 成功签出和构建后 工件将被存档 并触发下游作业来部署生成的工件 为了让第二个工作能够通过 class CopyArtifact 步骤 它需要复制权限 所以问题是
  • 如何在AWS中将AMI从爱尔兰区域复制到中国区域

    我在 AWS 爱尔兰区域有一个设置 现在我希望在中国使用该 AMI 有谁知道完成任务的最佳实践是什么 任何帮助将不胜感激 提前致谢 中国地区目前不支持 AMI 复制 根据AWS 将 AMI 从美国传输或复制到中国 北京 https foru
  • Django 删除确认视图显示变量名称而不是信息

    谁能帮我解决以下场景 我有 3 张桌子 如下所示 1和2是我的数据表 并且 3 与 1 和 2 保持关系 1 Qa table ID QA 1 qa1 2 qa2 3 qa3 a field of my Qa model tags sele
  • 如何覆盖/更新当前由 IIS 提供服务的文件?

    问题 我的公司每月发布一份时事通讯 我将其托管在我们的内部网站上 我有一个供时事通讯作者上传最新版本的页面 作者上传最新的新闻通讯后 他会发送一封广播电子邮件来宣布新的新闻通讯 员工总是会检查新的时事通讯并向作者发送反馈以及需要进行的更正